From c7ad47e9b29971509d8ea76e918b6f623ca52a17 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Thu, 9 Feb 2017 16:26:36 -0800 Subject: [PATCH] kernel32: Fix improper escaping of quotes in command line. Signed-off-by: Jacob Lifshay Signed-off-by: Alexandre Julliard --- dlls/kernel32/process.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 70c38ebdf0d..5b8a3d335e7 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -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 rupp->CommandLine.Buffer)