vim-patch:9.1.1948: Windows: Vim adds current directory to search path

Problem:  Windows: Vim always adds the current directory to search path.
          This should only happen when using cmd.exe as 'shell'. For
          example, powershell won't run binaries from the current
          directory.
Solution: Only add current directory to system path, when using cmd.exe
          as 'shell'.

related: vim/vim#10341
related: 083ec6d9a3b7

4d87c9742a

Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2025-12-04 11:28:44 +08:00
parent ac3e2ca675
commit bfe007a187
5 changed files with 22 additions and 15 deletions

View File

@@ -1875,10 +1875,12 @@ executable({expr}) *executable()*
On MS-Windows an executable in the same directory as the Vim On MS-Windows an executable in the same directory as the Vim
executable is always found (it's added to $PATH at |startup|). executable is always found (it's added to $PATH at |startup|).
*NoDefaultCurrentDirectoryInExePath* *NoDefaultCurrentDirectoryInExePath*
On MS-Windows an executable in Vim's current working directory On MS-Windows when using cmd.exe as 'shell' an executable in
is also normally found, but this can be disabled by setting Vim's current working directory is also normally found, which
the `$NoDefaultCurrentDirectoryInExePath` environment variable. can be disabled by setting the
This is always done for |:!| commands, for security reasons. `$NoDefaultCurrentDirectoryInExePath` environment variable.
This is always done when executing external commands using
e.g. |:!|, |:make|, |system()| for security reasons.
The result is a Number: The result is a Number:
1 exists 1 exists

View File

@@ -1650,10 +1650,12 @@ function vim.fn.eventhandler() end
--- On MS-Windows an executable in the same directory as the Vim --- On MS-Windows an executable in the same directory as the Vim
--- executable is always found (it's added to $PATH at |startup|). --- executable is always found (it's added to $PATH at |startup|).
--- *NoDefaultCurrentDirectoryInExePath* --- *NoDefaultCurrentDirectoryInExePath*
--- On MS-Windows an executable in Vim's current working directory --- On MS-Windows when using cmd.exe as 'shell' an executable in
--- is also normally found, but this can be disabled by setting --- Vim's current working directory is also normally found, which
--- the `$NoDefaultCurrentDirectoryInExePath` environment variable. --- can be disabled by setting the
--- This is always done for |:!| commands, for security reasons. --- `$NoDefaultCurrentDirectoryInExePath` environment variable.
--- This is always done when executing external commands using
--- e.g. |:!|, |:make|, |system()| for security reasons.
--- ---
--- The result is a Number: --- The result is a Number:
--- 1 exists --- 1 exists

View File

@@ -2161,10 +2161,12 @@ M.funcs = {
On MS-Windows an executable in the same directory as the Vim On MS-Windows an executable in the same directory as the Vim
executable is always found (it's added to $PATH at |startup|). executable is always found (it's added to $PATH at |startup|).
*NoDefaultCurrentDirectoryInExePath* *NoDefaultCurrentDirectoryInExePath*
On MS-Windows an executable in Vim's current working directory On MS-Windows when using cmd.exe as 'shell' an executable in
is also normally found, but this can be disabled by setting Vim's current working directory is also normally found, which
the `$NoDefaultCurrentDirectoryInExePath` environment variable. can be disabled by setting the
This is always done for |:!| commands, for security reasons. `$NoDefaultCurrentDirectoryInExePath` environment variable.
This is always done when executing external commands using
e.g. |:!|, |:make|, |system()| for security reasons.
The result is a Number: The result is a Number:
1 exists 1 exists

View File

@@ -355,7 +355,8 @@ static bool is_executable_in_path(const char *name, char **abspath)
#ifdef MSWIN #ifdef MSWIN
char *path = NULL; char *path = NULL;
if (!os_env_exists("NoDefaultCurrentDirectoryInExePath", false)) { if (!os_env_exists("NoDefaultCurrentDirectoryInExePath", false)
&& strstr(path_tail(p_sh), "cmd.exe") != NULL) {
// Prepend ".;" to $PATH. // Prepend ".;" to $PATH.
size_t pathlen = strlen(path_env); size_t pathlen = strlen(path_env);
path = xmallocz(pathlen + 2); path = xmallocz(pathlen + 2);

View File

@@ -202,9 +202,9 @@ describe('executable() (Windows)', function()
clear({ env = { PATHEXT = '' } }) clear({ env = { PATHEXT = '' } })
command('set shell=sh') command('set shell=sh')
for _, ext in ipairs(exts) do for _, ext in ipairs(exts) do
eq(1, call('executable', 'test_executable_' .. ext .. '.' .. ext)) eq(0, call('executable', 'test_executable_' .. ext .. '.' .. ext))
end end
eq(1, call('executable', 'test_executable_zzz.zzz')) eq(0, call('executable', 'test_executable_zzz.zzz'))
end) end)
it("relative path, Unix-style 'shell' (backslashes)", function() it("relative path, Unix-style 'shell' (backslashes)", function()