]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ShellParametersProtocol.c
ShellPkg: Refactor string manipulation
[mirror_edk2.git] / ShellPkg / Application / Shell / ShellParametersProtocol.c
index e052d24d5d336cf08a0176c42b4697768f6fc9b8..ff149009b14cda223df7d93e1c774da916129aa9 100644 (file)
@@ -35,8 +35,9 @@
 VOID\r
 EFIAPI\r
 GetNextParameter(\r
-  CHAR16 **Walker,\r
-  CHAR16 **TempParameter\r
+  IN OUT CHAR16   **Walker,\r
+  IN OUT CHAR16   **TempParameter,\r
+  IN CONST UINTN  Length\r
   )\r
 {\r
   CHAR16 *NextDelim;\r
@@ -82,7 +83,7 @@ GetNextParameter(
       //\r
       // found ""\r
       //\r
-      StrCpy(*TempParameter, L"");\r
+      *(*TempParameter) = CHAR_NULL;\r
       *Walker = NextDelim + 1;\r
     } else if (NextDelim != NULL) {\r
 \r
@@ -95,7 +96,7 @@ GetNextParameter(
       //\r
       // last one... someone forgot the training quote!\r
       //\r
-      StrCpy(*TempParameter, *Walker);\r
+      StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);\r
       *Walker = NULL;\r
     }\r
     for (TempLoc = *TempParameter ; TempLoc != NULL && *TempLoc != CHAR_NULL ; TempLoc++) {\r
@@ -117,7 +118,7 @@ GetNextParameter(
       //\r
       // last one.\r
       //\r
-      StrCpy(*TempParameter, *Walker);\r
+      StrnCpy(*TempParameter, *Walker, Length/sizeof(CHAR16) - 1);\r
       *Walker = NULL;\r
     }\r
     for (NextDelim = *TempParameter ; NextDelim != NULL && *NextDelim != CHAR_NULL ; NextDelim++) {\r
@@ -181,17 +182,10 @@ ParseCommandLineToArgs(
   for ( Count = 0\r
       , Walker = (CHAR16*)CommandLine\r
       ; Walker != NULL && *Walker != CHAR_NULL\r
-      ; GetNextParameter(&Walker, &TempParameter)\r
+      ; GetNextParameter(&Walker, &TempParameter, Size)\r
       , Count++\r
      );\r
 \r
-/*  Count = 0;\r
-  Walker = (CHAR16*)CommandLine;\r
-  while(Walker != NULL) {\r
-    GetNextParameter(&Walker, &TempParameter);\r
-    Count++;\r
-  }\r
-*/\r
   //\r
   // lets allocate the pointer array\r
   //\r
@@ -205,10 +199,12 @@ ParseCommandLineToArgs(
   Walker = (CHAR16*)CommandLine;\r
   while(Walker != NULL && *Walker != CHAR_NULL) {\r
     SetMem16(TempParameter, Size, CHAR_NULL);\r
-    GetNextParameter(&Walker, &TempParameter);\r
-    NewParam = AllocateZeroPool(StrSize(TempParameter));\r
-    ASSERT(NewParam != NULL);\r
-    StrCpy(NewParam, TempParameter);\r
+    GetNextParameter(&Walker, &TempParameter, Size);\r
+    NewParam = AllocateCopyPool(StrSize(TempParameter), TempParameter);\r
+    if (NewParam == NULL){\r
+      SHELL_FREE_NON_NULL(TempParameter);\r
+      return (EFI_OUT_OF_RESOURCES);\r
+    }\r
     ((CHAR16**)(*Argv))[(*Argc)] = NewParam;\r
     (*Argc)++;\r
   }\r
@@ -976,7 +972,7 @@ UpdateStdInStdOutStdErr(
   //\r
   // re-populate the string to support any filenames that were in quotes.\r
   //\r
-  StrCpy(CommandLineCopy, NewCommandLine);\r
+  StrnCpy(CommandLineCopy, NewCommandLine, StrLen(NewCommandLine));\r
 \r
   if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)\r
     && ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))\r