From 1f96aa01f72bba8c9a0600280594a1a92bb505fc Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 11 May 2012 01:39:04 +0200 Subject: [PATCH] system-quote, execute, spawn-pipe: Escape '?' on Windows. * lib/system-quote.c (SHELL_SPECIAL_CHARS, CMD_SPECIAL_CHARS): Add the '?' character. * lib/w32spawn.h (SHELL_SPECIAL_CHARS): Likewise. * tests/test-system-quote-main.c (check_all): Check also strings like "??????????". Reported by Eli Zaretskii . --- ChangeLog | 10 ++++++++++ lib/system-quote.c | 13 +++++++++---- lib/w32spawn.h | 11 ++++++++--- tests/test-system-quote-main.c | 9 +++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9edbd9c8b..52789d341 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-05-10 Bruno Haible + + system-quote, execute, spawn-pipe: Escape '?' on Windows. + * lib/system-quote.c (SHELL_SPECIAL_CHARS, CMD_SPECIAL_CHARS): Add the + '?' character. + * lib/w32spawn.h (SHELL_SPECIAL_CHARS): Likewise. + * tests/test-system-quote-main.c (check_all): Check also strings like + "??????????". + Reported by Eli Zaretskii . + 2012-05-10 Paul Eggert _Noreturn: port config.h to gcc -Wundef diff --git a/lib/system-quote.c b/lib/system-quote.c index 37a9ff410..ab2c2f11b 100644 --- a/lib/system-quote.c +++ b/lib/system-quote.c @@ -42,10 +42,15 @@ \" -> " \\\" -> \" \\\\\" -> \\" - - '*' characters may get expanded or lead to a failure with error code - ERROR_PATH_NOT_FOUND. + - '*', '?' characters may get expanded through wildcard expansion in the + callee: By default, in the callee, the initialization code before main() + takes the result of GetCommandLine(), wildcard-expands it, and passes it + to main(). The exceptions to this rule are: + - programs that inspect GetCommandLine() and ignore argv, + - mingw programs that have a global variable 'int _CRT_glob = 0;', + - Cygwin programs, when invoked from a Cygwin program. */ -# define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*" +# define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?" # define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" /* Copies the quoted string to p and returns the number of bytes needed. @@ -112,7 +117,7 @@ windows_createprocess_quote (char *p, const char *string) double-quotes and the rest of the string inside double-quotes: %"var"%. This is guaranteed to not be a reference to an environment variable. */ -# define CMD_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037!%&'*+,;<=>[]^`{|}~" +# define CMD_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037!%&'*+,;<=>?[]^`{|}~" # define CMD_FORBIDDEN_CHARS "\n\r" /* Copies the quoted string to p and returns the number of bytes needed. diff --git a/lib/w32spawn.h b/lib/w32spawn.h index bbc7a3d4d..49a3900e1 100644 --- a/lib/w32spawn.h +++ b/lib/w32spawn.h @@ -115,10 +115,15 @@ undup_safer_noinherit (int tempfd, int origfd) \" -> " \\\" -> \" \\\\\" -> \\" - - '*' characters may get expanded or lead to a failure with error code - ERROR_PATH_NOT_FOUND. + - '*', '?' characters may get expanded through wildcard expansion in the + callee: By default, in the callee, the initialization code before main() + takes the result of GetCommandLine(), wildcard-expands it, and passes it + to main(). The exceptions to this rule are: + - programs that inspect GetCommandLine() and ignore argv, + - mingw programs that have a global variable 'int _CRT_glob = 0;', + - Cygwin programs, when invoked from a Cygwin program. */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*" +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" static char ** prepare_spawn (char **argv) diff --git a/tests/test-system-quote-main.c b/tests/test-system-quote-main.c index 10fe82308..018279aeb 100644 --- a/tests/test-system-quote-main.c +++ b/tests/test-system-quote-main.c @@ -248,6 +248,15 @@ check_all (enum system_command_interpreter interpreter, /* '?' would be interpreted as a wildcard character. */ check_one (interpreter, prog, "?"); + check_one (interpreter, prog, "??"); + check_one (interpreter, prog, "???"); + check_one (interpreter, prog, "????"); + check_one (interpreter, prog, "?????"); + check_one (interpreter, prog, "??????"); + check_one (interpreter, prog, "???????"); + check_one (interpreter, prog, "????????"); + check_one (interpreter, prog, "?????????"); + check_one (interpreter, prog, "??????????"); check_one (interpreter, prog, "foo?bar"); /* '^' would be interpreted in old /bin/sh, e.g. SunOS 4.1.4. */ -- 2.11.0