kernel32: Fix improper escaping of quotes in command line.

Signed-off-by: Jacob Lifshay <programmerjake@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacob Lifshay 2017-02-09 16:26:36 -08:00 committed by Alexandre Julliard
parent f353e42561
commit c7ad47e9b2
1 changed files with 14 additions and 5 deletions

View File

@ -745,6 +745,10 @@ static void update_library_argv0( const WCHAR *argv0 )
* resulting in an odd number of '\' followed by a '"'
* '\"' -> '\\\"'
* '\\"' -> '\\\\\"'
* - '\'s are followed by the closing '"' must be doubled,
* resulting in an even number of '\' followed by a '"'
* ' \' -> '" \\"'
* ' \\' -> '" \\\\"'
* - '\'s that are not followed by a '"' can be left as is
* 'a\b' == 'a\b'
* 'a\\b' == 'a\\b'
@ -787,7 +791,7 @@ static BOOL build_command_line( WCHAR **argv )
}
len+=(a-*arg)+1 /* for the separating space */;
if (has_space)
len+=2; /* for the quotes */
len+=2+bcount; /* for the quotes and doubling of '\' preceding the closing quote */
}
if (!(rupp->CommandLine.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, len * sizeof(WCHAR))))
@ -800,6 +804,7 @@ static BOOL build_command_line( WCHAR **argv )
{
BOOL has_space,has_quote;
WCHAR* a;
int bcount;
/* Check for quotes and spaces in this argument */
has_space=has_quote=FALSE;
@ -821,9 +826,7 @@ static BOOL build_command_line( WCHAR **argv )
/* Now transfer it to the command line */
if (has_space)
*p++='"';
if (has_quote) {
int bcount;
if (has_quote || has_space) {
bcount=0;
a=*arg;
while (*a!='\0') {
@ -849,8 +852,14 @@ static BOOL build_command_line( WCHAR **argv )
WCHAR* x = *arg;
while ((*p=*x++)) p++;
}
if (has_space)
if (has_space) {
int i;
/* Double all the '\' preceding the closing quote */
for (i=0;i<bcount;i++)
*p++='\\';
*p++='"';
}
*p++=' ';
}
if (p > rupp->CommandLine.Buffer)