Rework quote_arg()
PATCH 1/1 Rework quote_arg()
MS Windows command line is handled in a weird way. This patch addresses:
- Quote empty arguments
- Only escape backslashes and double quotation marks inside quoted arguments
- Quote arguments if they have asterisk or question marks to prevent expansion
The last one is not documented in the link provided in the patch. I encountered that behavior on cmd.exe, Windows XP. MSYS not tested.
Signed-off-by Nguyễn Thái Ngọc Duy <[email protected]>
--- compat/mingw.c | 31 ++++++++++++++++++++++++++++--- 1 files changed, 28 insertions(+), 3 deletions(-)
compat/mingw.c +28 -3
@@ -303,6 +303,7 @@ void openlog(const char *ident, int option, int facility) { } +/* See http://msdn2.microsoft.com/en-us/library/17w5ykft(vs.71).aspx (Parsing C++ Command-Line Arguments */ static const char *quote_arg (const char *arg) {/* count chars to quote */
@@ -310,11 +311,23 @@ static const char *quote_arg(const char *arg)int force_quotes =0 ;char *q, *d;const char *p = arg; +if (!*p) force_quotes =1 ;while (*p) { -if (isspace (*p)) +if (isspace (*p) || *p =='*' || *p =='?' ) force_quotes =1 ; -else if (*p =='"' || *p =='\\' ) +else if (*p =='"' ) n++; +else if (*p =='\\' ) { +int count =0 ; +while (*p =='\\' ) { + count++; + p++; + len++; + } +if (*p =='"' ) + n += count*2 +1 ; +continue ; + } len++; p++; }
@@ -325,8 +338,20 @@ static const char *quote_arg(const char *arg) d = q =xmalloc (len+n+3 ); *d++ ='"' ;while (*arg) { -if (*arg =='"' || *arg =='\\' ) +if (*arg =='"' ) *d++ ='\\' ; +else if (*arg =='\\' ) { +int count =0 ; +while (*arg =='\\' ) { + count++; + *d++ = *arg++; + } +if (*arg =='"' ) { +while (count-- >0 ) + *d++ ='\\' ; + *d++ ='\\' ; + } + } *d++ = *arg++; } *d++ ='"' ;
Signature · 1 line
1.5.3.rc4.3.gab089