[PATCH 4/5] cmd: fix handling of special characters in command line (try 5)

Martin Wilck mwilck at arcor.de
Thu Sep 29 15:10:51 CDT 2011


A semicolon must be treated as parameter separator (like comma).
An opening parenthesis ends a command name but is legal in parameters.
---
 programs/cmd/tests/test_cmdline.cmd.exp |    8 ++++----
 programs/cmd/wcmdmain.c                 |    7 +++++--
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/programs/cmd/tests/test_cmdline.cmd.exp b/programs/cmd/tests/test_cmdline.cmd.exp
index 6d5805a..275c701 100644
--- a/programs/cmd/tests/test_cmdline.cmd.exp
+++ b/programs/cmd/tests/test_cmdline.cmd.exp
@@ -10,7 +10,7 @@
 0 at space@
 3 at space@
 3 at space@
- at todo_wine@4 at space@
+4 at space@
 ------ Testing invocation with CMD /C -------------
 0 at space@
 1 at space@
@@ -22,7 +22,7 @@
 2 at space@
 0 at space@
 3 at space@
- at todo_wine@4 at space@
+4 at space@
 ---------- Testing CMD /C quoting -----------------
 "hi"
 1 at space@
@@ -46,14 +46,14 @@
 0 at space@
 --------- Testing special characters --------------
 0 at space@
- at todo_wine@0 at space@
+0 at space@
 )@space@
 [@space@
 ]@space@
 {@space@
 }@space@
 0 at space@
- at todo_wine@0 at space@
+0 at space@
 !@space@
 @todo_wine at 0@space@@or_broken@!@space@
 @todo_wine at 0@space@
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 8a5cee1..4841c47 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -936,7 +936,8 @@ static void WCMD_parse (const WCHAR *s, WCHAR *q, WCHAR *p1, WCHAR *p2)
         /* fall through to default case */
       default:
 	while ((*s != '\0') && (*s != ' ') && (*s != '\t')
-               && (*s != '=')  && (*s != ',') && (*s != '"')) {
+               && (*s != '=')  && (*s != ',') && (*s != '"') && (*s != ';')
+               && (*s != '(' || p > 0)) {
 	  if (p == 0) *p1++ = *s++;
 	  else if (p == 1) *p2++ = *s++;
 	  else s++;
@@ -945,7 +946,9 @@ static void WCMD_parse (const WCHAR *s, WCHAR *q, WCHAR *p1, WCHAR *p2)
             /* opening quote - go back to '"' case */
             break;
         /* Skip concurrent parms */
-	while ((*s == ' ') || (*s == '\t') || (*s == '=')  || (*s == ',') ) s++;
+        while ((*s == ' ') || (*s == '\t') || (*s == '=')  || (*s == ',')
+               || (*s == ';'))
+          s++;
 
         if (p == 0) *p1 = '\0';
         if (p == 1) *p2 = '\0';
-- 
1.7.3.4



More information about the wine-patches mailing list