[PATCH 4/9] cmd: improve parsing of quotes in command line

Martin Wilck mwilck at arcor.de
Mon Sep 19 18:51:14 CDT 2011


Fix parsing of quotes inside words (f"oo b"ar, two" "words) in
the CMD.EXE command line.
---
 programs/cmd/wcmdmain.c |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index c0fcc08..9a1d0d8 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -886,6 +886,10 @@ static void WCMD_parse (const WCHAR *s, WCHAR *q, WCHAR *p1, WCHAR *p2)
   *q = *p1 = *p2 = '\0';
   while (TRUE) {
     switch (*s) {
+      case '\0':
+	if (p == 0) *p1 = '\0';
+	if (p == 1) *p2 = '\0';
+	return;
       case '/':
         *q++ = *s++;
 	while ((*s != '\0') && (*s != ' ') && *s != '/') {
@@ -904,20 +908,21 @@ static void WCMD_parse (const WCHAR *s, WCHAR *q, WCHAR *p1, WCHAR *p2)
 	  else if (p == 1) *p2++ = *s++;
 	  else s++;
 	}
-        if (p == 0) *p1 = '\0';
-        if (p == 1) *p2 = '\0';
-        p++;
-	if (*s == '"') s++;
-	break;
-      case '\0':
-        return;
+	if (*s == '\0')
+	  break;
+	s++;
+	/* closing quote - parameter ends only if followed by whitespace */
+	/* fall through to default case */
       default:
 	while ((*s != '\0') && (*s != ' ') && (*s != '\t')
-               && (*s != '=')  && (*s != ',') ) {
+               && (*s != '=')  && (*s != ',') && (*s != '"')) {
 	  if (p == 0) *p1++ = *s++;
 	  else if (p == 1) *p2++ = *s++;
 	  else s++;
 	}
+	if (*s == '"')
+	    /* opening quote - go back to '"' case */
+	    break;
         /* Skip concurrent parms */
 	while ((*s == ' ') || (*s == '\t') || (*s == '=')  || (*s == ',') ) s++;
 
@@ -1439,7 +1444,8 @@ void WCMD_execute (const WCHAR *command, const WCHAR *redirects,
  */
 
     count = 0;
-    while (IsCharAlphaNumericW(whichcmd[count])) {
+    /* 'echo" one"' is not 'echo one' */
+    while (IsCharAlphaNumericW(whichcmd[count]) || whichcmd[count] == '"') {
       count++;
     }
     for (i=0; i<=WCMD_EXIT; i++) {
-- 
1.7.3.4



More information about the wine-patches mailing list