changeset 16846:a80d21de5373

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>.
author Bruno Haible <bruno@clisp.org>
date Fri, 11 May 2012 01:39:04 +0200
parents 1118b1dc4eab
children 53fb1ea35cc9
files ChangeLog lib/system-quote.c lib/w32spawn.h tests/test-system-quote-main.c
diffstat 4 files changed, 36 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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 @@
    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.
--- a/lib/w32spawn.h
+++ b/lib/w32spawn.h
@@ -115,10 +115,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"
 static char **
 prepare_spawn (char **argv)
--- a/tests/test-system-quote-main.c
+++ b/tests/test-system-quote-main.c
@@ -248,6 +248,15 @@
 
     /* '?' 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.  */