[PATCH 4/5] cmd: fix handling of special characters in command line
Martin Wilck
mwilck at arcor.de
Sun Sep 25 08:19:43 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 8913d2c..bb74504 100755
--- 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@
@todo_wine at 0@space@
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 0f3cebb..9faf35b 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -915,7 +915,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++;
@@ -924,7 +925,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