system-quote, execute, spawn-pipe: Escape '?' on Windows.
authorBruno Haible <bruno@clisp.org>
Thu, 10 May 2012 23:39:04 +0000 (01:39 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 10 May 2012 23:39:04 +0000 (01:39 +0200)
* 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 <eliz@gnu.org>.

ChangeLog
lib/system-quote.c
lib/w32spawn.h
tests/test-system-quote-main.c

index 9edbd9c..52789d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-05-10  Bruno Haible  <bruno@clisp.org>
+
+       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 <eliz@gnu.org>.
+
 2012-05-10  Paul Eggert  <eggert@cs.ucla.edu>
 
        _Noreturn: port config.h to gcc -Wundef
index 37a9ff4..ab2c2f1 100644 (file)
        \" -> "
        \\\" -> \"
        \\\\\" -> \\"
-   - '*' 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.
index bbc7a3d..49a3900 100644 (file)
@@ -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)
index 10fe823..018279a 100644 (file)
@@ -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.  */