Browse Source

From: David Decotigny <decot@googlers.com>
Date: Mon, 28 Jul 2014 21:01:35 -0700
Subject: [PATCH 1/3] Fix cmdline parser

The cmdline parser would not return the correct number of args, would
allocate one too many. Also make it clear from the declaration that we
expect a suitably lare argv.

Signed-off-by: David Decotigny <decot@googlers.com>
Signed-off-by: Nigel Croxon <nigel.croxon@hp.com>

Nigel Croxon 10 years ago
parent
commit
8d86ee202a
2 changed files with 19 additions and 23 deletions
  1. 2 3
      gnu-efi-3.0/inc/ParseCmdLine.h
  2. 17 20
      gnu-efi-3.0/lib/ParseCmdLine.c

+ 2 - 3
gnu-efi-3.0/inc/ParseCmdLine.h

@@ -7,6 +7,5 @@
 
 #define MAX_ARGS 512
 
-
-int ParseCmdLine(CHAR16 *argv[],  CHAR16 *buf, int len);
-
+/* buf will be updated in-place */
+INTN ParseCmdLine(CHAR16 *argv[MAX_ARGS],  CHAR16 *buf, UINTN len);

+ 17 - 20
gnu-efi-3.0/lib/ParseCmdLine.c

@@ -11,28 +11,25 @@
 
 
 
-int ParseCmdLine(CHAR16 *argv[],  CHAR16 *LoadOptions, int LoadOptionSize)
+INTN ParseCmdLine(CHAR16 *argv[MAX_ARGS], CHAR16 *buf, UINTN len)
 {
-    CHAR16 *buf = LoadOptions;
-    int     len = LoadOptionSize;
-    int	    i;	  // Index into buf
-
-    int argc = 0;	// Count of argv entries
-    argv[argc++] = LoadOptions ? LoadOptions: L"##NoName##";
-
-    for ( i = 0;  len > 0;   len-= 2, i++)  {
-	if ( buf[i] == L' ' ) {
-	    // end of current argv entry, start next?
-	    buf[i] = L'\0';
-	    do {
-	    	len -= 2;
-		i++;
-	    } while( (buf[i] == L' ') && (len > 0) );
-	    argv[argc] = &buf[i];
-	    if ( len > 0 ) argc++;
-	}
+    CHAR16 *arg_start, *c;
+    INTN argc = 0;
+
+    if (len < 2)
+      return -1;
+
+    buf[(len / 2) - 1] = L'\0';
+    for (c = arg_start = buf ; *c ; ++c) {
+      if (*c == L' ') {
+        *c = L'\0';
+        if (argc < MAX_ARGS) argv[argc++] = arg_start;
+        arg_start = c + 1;
+      }
     }
-    argv[argc] = NULL;
+
+    if ((*arg_start != L'\0') && (argc < MAX_ARGS))
+      argv[argc++] = arg_start;
 
     return argc;
 }