From a19a770f96ca1b09c4bef449c082b7da38964dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Iv=C4=83ncescu?= Date: Tue, 5 May 2020 16:10:37 +0300 Subject: [PATCH] cmd.exe: Don't treat explicit paths as a PATH search list. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example, the explicit path "C:\some;path" is currently treated as if the PATH environment variable is "C:\some;path" which is obviously wrong, and searches for the directories "C:\some" and "path". Signed-off-by: Gabriel Ivăncescu Signed-off-by: Alexandre Julliard --- programs/cmd/wcmdmain.c | 67 ++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 16843e40873..4026f3e6bef 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1045,6 +1045,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) WCHAR pathext[MAXSTRING]; WCHAR *firstParam; BOOL extensionsupplied = FALSE; + BOOL explicit_path = FALSE; BOOL status; DWORD len; static const WCHAR envPath[] = {'P','A','T','H','\0'}; @@ -1084,6 +1085,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) /* Reduce pathtosearch to a path with trailing '\' to support c:\a.bat and c:\windows\a.bat syntax */ if (lastSlash) *(lastSlash + 1) = 0x00; + explicit_path = TRUE; } /* Now extract PATHEXT */ @@ -1103,37 +1105,48 @@ void WCMD_run_program (WCHAR *command, BOOL called) BOOL found = FALSE; BOOL inside_quotes = FALSE; - /* Work on the first directory on the search path */ - pos = pathposn; - while ((inside_quotes || *pos != ';') && *pos != 0) + if (explicit_path) { - if (*pos == '"') - inside_quotes = !inside_quotes; - pos++; + lstrcpyW(thisDir, pathposn); + pathposn = NULL; } - - if (*pos) { /* Reached semicolon */ - memcpy(thisDir, pathposn, (pos-pathposn) * sizeof(WCHAR)); - thisDir[(pos-pathposn)] = 0x00; - pathposn = pos+1; - } else { /* Reached string end */ - lstrcpyW(thisDir, pathposn); - pathposn = NULL; - } - - /* Remove quotes */ - length = lstrlenW(thisDir); - if (thisDir[length - 1] == '"') - thisDir[length - 1] = 0; - - if (*thisDir != '"') - lstrcpyW(temp, thisDir); else - lstrcpyW(temp, thisDir + 1); + { + /* Work on the next directory on the search path */ + pos = pathposn; + while ((inside_quotes || *pos != ';') && *pos != 0) + { + if (*pos == '"') + inside_quotes = !inside_quotes; + pos++; + } - /* Since you can have eg. ..\.. on the path, need to expand - to full information */ - GetFullPathNameW(temp, MAX_PATH, thisDir, NULL); + if (*pos) /* Reached semicolon */ + { + memcpy(thisDir, pathposn, (pos-pathposn) * sizeof(WCHAR)); + thisDir[(pos-pathposn)] = 0x00; + pathposn = pos+1; + } + else /* Reached string end */ + { + lstrcpyW(thisDir, pathposn); + pathposn = NULL; + } + + /* Remove quotes */ + length = lstrlenW(thisDir); + if (thisDir[length - 1] == '"') + thisDir[length - 1] = 0; + + if (*thisDir != '"') + lstrcpyW(temp, thisDir); + else + lstrcpyW(temp, thisDir + 1); + + /* Since you can have eg. ..\.. on the path, need to expand + to full information */ + GetFullPathNameW(temp, MAX_PATH, thisDir, NULL); + } /* 1. If extension supplied, see if that file exists */ lstrcatW(thisDir, slashW);