Commit: runtime(vim9): Fix dist#vim9#Open() spaced paths and SIGPIPE crashes

1 view
Skip to first unread message

Christian Brabandt

unread,
Apr 6, 2026, 8:47:20 AM (10 days ago) Apr 6
to vim...@googlegroups.com
runtime(vim9): Fix dist#vim9#Open() spaced paths and SIGPIPE crashes

Commit: https://github.com/vim/vim/commit/48581f2ba96550f5499cc322647b2ff1df5ad4ed
Author: Furkan Sahin <furka...@proton.me>
Date: Mon Apr 6 12:43:07 2026 +0000

runtime(vim9): Fix dist#vim9#Open() spaced paths and SIGPIPE crashes

Problem: dist#vim9#Open() fails to open files with spaces on Linux
because Launch() splits the command string. Also,
background GUI viewers (e.g., xdg-open) crash with SIGPIPE
when Vim destroys the default job_start() IO pipes.
Solution: Use job_start() with 'sh -c' to let the POSIX shell parse
the shellescaped quotes safely. Set 'in_io', 'out_io', and
'err_io' to 'null' to completely detach the background
process and prevent pipe crashes. Unify the Launch()
execution block across all operating systems.

closes: #19928
fixes: #19916

Signed-off-by: Furkan Sahin <furka...@proton.me>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/autoload/dist/vim9.vim b/runtime/autoload/dist/vim9.vim
index 87b3dbb87..d82467391 100644
--- a/runtime/autoload/dist/vim9.vim
+++ b/runtime/autoload/dist/vim9.vim
@@ -3,7 +3,7 @@ vim9script
# Vim runtime support library
#
# Maintainer: The Vim Project <https://github.com/vim/vim>
-# Last Change: 2026 Mar 10
+# Last Change: 2026 Apr 06

export def IsSafeExecutable(filetype: string, executable: string): bool
if empty(exepath(executable))
@@ -62,7 +62,7 @@ if has('unix')
export def Launch(args: string)
# Use job_start, because using !xdg-open is known not to work with zsh
# ignore signals on exit
- job_start(split(args), {'stoponexit': ''})
+ job_start(['sh', '-c', args], {'stoponexit': '', 'in_io': 'null', 'out_io': 'null', 'err_io': 'null'})
enddef
endif
elseif has('win32')
@@ -139,13 +139,7 @@ export def Open(file: string)
setlocal shell&
defer setbufvar('%', '&shell', shell)
endif
- if has('unix') && !has('win32unix') && !exists('$WSL_DISTRO_NAME')
- # Linux: using job_start, so do not use shellescape.
- Launch($"{Viewer()} {file}")
- else
- # Windows/WSL/Cygwin: NEEDS shellescape because Launch uses '!'
- Launch($"{Viewer()} {shellescape(file, 1)}")
- endif
+ Launch($"{Viewer()} {shellescape(file, 1)}")
enddef

# Uncomment this line to check for compilation errors early
Reply all
Reply to author
Forward
0 new messages