cmd.exe: Don't treat explicit paths as a PATH search list.

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 <gabrielopcode@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gabriel Ivăncescu 2020-05-05 16:10:37 +03:00 committed by Alexandre Julliard
parent d784de82c8
commit a19a770f96
1 changed files with 40 additions and 27 deletions

View File

@ -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,7 +1105,14 @@ void WCMD_run_program (WCHAR *command, BOOL called)
BOOL found = FALSE;
BOOL inside_quotes = FALSE;
/* Work on the first directory on the search path */
if (explicit_path)
{
lstrcpyW(thisDir, pathposn);
pathposn = NULL;
}
else
{
/* Work on the next directory on the search path */
pos = pathposn;
while ((inside_quotes || *pos != ';') && *pos != 0)
{
@ -1112,11 +1121,14 @@ void WCMD_run_program (WCHAR *command, BOOL called)
pos++;
}
if (*pos) { /* Reached semicolon */
if (*pos) /* Reached semicolon */
{
memcpy(thisDir, pathposn, (pos-pathposn) * sizeof(WCHAR));
thisDir[(pos-pathposn)] = 0x00;
pathposn = pos+1;
} else { /* Reached string end */
}
else /* Reached string end */
{
lstrcpyW(thisDir, pathposn);
pathposn = NULL;
}
@ -1134,6 +1146,7 @@ void WCMD_run_program (WCHAR *command, BOOL called)
/* 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);