patch 9.1.2004: MS-Windows: executable() cannot find file in directory with single char
Commit: https://github.com/vim/vim/commit/bd686d85dc2b1488ab10c723125d654e0e2d7ef4 Author: Muraoka Taro <[email protected]> Date: Sun Dec 21 19:19:39 2025 +0000 patch 9.1.2004: MS-Windows: executable() cannot find file in directory with single char Problem: MS-Windows: If a directory with a single character name is included in the PATH environment variable without a trailing path separator, executable() will not be able to find the executable file under it. Solution: The second argument of the after_pathsep() function is now passed the next pointer where a path separator may exist (Muraoka Taro). As a specific example, the default installation path for PowerShell v7 is "C:\Program Files\PowerShell ", but if you set this as is in the PATH environment variable, Vim will not be able to find the pwsh.exe command. In this case, Vim will try to search for "C:\Program Files\PowerShell pwsh.exe". Cause: The after_pathsep() function determines whether the location passed as its second argument immediately follows a path separator. However, in the code where the problem occurred, the second argument was passed a location that might contain a path separator. As a result, it was mistakenly determined that a path separator was present in cases where the final directory name was a single character and not followed by a path separator, and the path to search was incorrect. closes: #18979 Signed-off-by: Muraoka Taro <[email protected]> Signed-off-by: Christian Brabandt <[email protected]> diff --git a/src/os_win32.c b/src/os_win32.c index 21b7023fa..ede7a15b2 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -2920,7 +2920,7 @@ executable_exists( (char *)buf, sizeof(buf), "%.*s%s%s", (int)(e - p), p, - !after_pathsep(p, e - 1) ? PATHSEPSTR : "", + !after_pathsep(p, e) ? PATHSEPSTR : "", name); } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 9d66985d6..ec721d057 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -2140,6 +2140,41 @@ func Test_executable_longname() call delete(fname) endfunc +func Test_executable_single_character_dir() + call mkdir('Xpath', 'R') + call mkdir('Xpath/a') + call mkdir('Xpath/b') + call mkdir('Xpath/c') + if has('win32') + call writefile([], 'Xpath/a/Xcmd1.bat') + call writefile([], 'Xpath/b/Xcmd2.bat') + call writefile([], 'Xpath/c/Xcmd3.bat') + let sep = ';' + else + call writefile([], 'Xpath/a/Xcmd1') + call writefile([], 'Xpath/b/Xcmd2') + call writefile([], 'Xpath/c/Xcmd3') + call setfperm('Xpath/a/Xcmd1', 'rwxr-xr-x') + call setfperm('Xpath/b/Xcmd2', 'rwxr-xr-x') + call setfperm('Xpath/c/Xcmd3', 'rwxr-xr-x') + let sep = ':' + endif + + let save_path = $PATH + " a: single character name without path seperator + " b: single character name with path seperator + " c: single character name without path seperator at last of PATH + let $PATH = [ + \ fnamemodify('./Xpath/a', ':p:h'), + \ fnamemodify('./Xpath/b', ':p'), + \ fnamemodify('./Xpath/c', ':p:h') + \ ]->join(sep) + call assert_true(executable('Xcmd1')) + call assert_true(executable('Xcmd2')) + call assert_true(executable('Xcmd3')) + let $PATH = save_path +endfunc + func Test_hostname() let hostname_vim = hostname() if has('unix') diff --git a/src/version.c b/src/version.c index fbadafea2..a0cbb675e 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2004, /**/ 2003, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1vXP80-008xpK-La%40256bit.org.
