Commit 87917df8 authored by Brendan McGrath's avatar Brendan McGrath Committed by Alexandre Julliard

kernel32: Allow double quote style escape in argv.

Two quotes together (within outer quotes) represents a single quote (with the first quote acting as an escape character) Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46721Signed-off-by: 's avatarBrendan McGrath <brendan@redmandi.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 922049a2
......@@ -1505,9 +1505,13 @@ static char **build_argv( const UNICODE_STRING *cmdlineW, int reserved )
/* '\', count them */
bcount++;
} else if ((*s=='"') && ((bcount & 1)==0)) {
/* unescaped '"' */
in_quotes=!in_quotes;
bcount=0;
if (in_quotes && s[1] == '"') {
s++;
} else {
/* unescaped '"' */
in_quotes=!in_quotes;
bcount=0;
}
} else {
/* a regular character */
bcount=0;
......@@ -1551,7 +1555,12 @@ static char **build_argv( const UNICODE_STRING *cmdlineW, int reserved )
*/
d-=bcount/2;
s++;
in_quotes=!in_quotes;
if(in_quotes && *s == '"') {
*d++='"';
s++;
} else {
in_quotes=!in_quotes;
}
} else {
/* Preceded by an odd number of '\', this is half that
* number of '\' followed by a '"'
......
......@@ -896,7 +896,7 @@ static void test_CommandLine(void)
/* the basics */
get_file_name(resfile);
sprintf(buffer, "\"%s\" tests/process.c dump \"%s\" \"C:\\Program Files\\my nice app.exe\"", selfname, resfile);
sprintf(buffer, "\"%s\" tests/process.c dump \"%s\" \"C:\\Program Files\\my nice app.exe\" \"\"\"\"", selfname, resfile);
ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n");
/* wait for child to terminate */
ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n");
......@@ -905,9 +905,10 @@ static void test_CommandLine(void)
CloseHandle(info.hThread);
CloseHandle(info.hProcess);
okChildInt("Arguments", "argcA", 5);
okChildInt("Arguments", "argcA", 6);
okChildString("Arguments", "argvA4", "C:\\Program Files\\my nice app.exe");
okChildString("Arguments", "argvA5", NULL);
okChildString("Arguments", "argvA5", "\"");
okChildString("Arguments", "argvA6", NULL);
okChildString("Arguments", "CommandLineA", buffer);
release_memory();
DeleteFileA(resfile);
......
......@@ -815,9 +815,13 @@ static char **build_argv( const UNICODE_STRING *cmdlineW, int reserved )
else if (*s == '\\') bcount++; /* '\', count them */
else if ((*s == '"') && ((bcount & 1) == 0))
{
/* unescaped '"' */
in_quotes = !in_quotes;
bcount = 0;
if (in_quotes && s[1] == '"') s++;
else
{
/* unescaped '"' */
in_quotes = !in_quotes;
bcount = 0;
}
}
else bcount = 0; /* a regular character */
s++;
......@@ -864,7 +868,12 @@ static char **build_argv( const UNICODE_STRING *cmdlineW, int reserved )
*/
d -= bcount/2;
s++;
in_quotes = !in_quotes;
if (in_quotes && *s == '"')
{
*d++ = '"';
s++;
}
else in_quotes = !in_quotes;
}
else
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment