http://bugs.winehq.org/show_bug.cgi?id=25901
Summary: Incorrect command line parsing in cmd Product: Wine Version: 1.3.12 Platform: x86 OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: cmd AssignedTo: wine-bugs@winehq.org ReportedBy: atohom@gmail.com
#include <stdio.h> #include <windows.h>
int main(int nargs, char *args[]) { if(nargs>1) { char *cl=GetCommandLine(); printf("%s\n", cl); } else { STARTUPINFO si={sizeof(STARTUPINFO)}; PROCESS_INFORMATION pi; CreateProcess(NULL, "cmd /C ""test.exe" "1 2 3""", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CreateProcess(NULL, "cmd /C ""test.exe" ""1 2 3"""", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CreateProcess(NULL, "cmd /C test.exe " 1", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CreateProcess(NULL, "cmd /C test.exe "\"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CreateProcess(NULL, "cmd /C test.exe "/"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); } return 0; }
On Windows this test program prints:
"test.exe" "1 2 3" "test.exe" ""1 2 3"" test.exe " 1 test.exe "" test.exe "/"
but in wine you get:
test.exe 1 2 3 test.exe 1 2 3 test.exe " 1" test.exe " test.exe /
quote from cmd help on how it is supposed to work:
If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters:
1. If all of the following conditions are met, then quote characters on the command line are preserved:
- no /S switch - exactly two quote characters - no special characters between the two quote characters, where special is one of: &<>()@^| - there are one or more whitespace characters between the two quote characters - the string between the two quote characters is the name of an executable file.
2. Otherwise, old behavior is to see if the first character is a quote character and if so, strip the leading character and remove the last quote character on the command line, preserving any text after the last quote character.