Difference with previous version:
It's not correct to casts away constness to allow TrimSpaces() to modify 
'commandline'.
This version make a copy of 'commandLine' and work with that in the remainder 
of the function.

Cc: Jaben Carsey <jaben.car...@intel.com>
Cc: Ruiyu Ni <ruiyu...@intel.com>
Cc: Yang Jadis <jadis.y...@intel.com>
Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <shumin....@intel.com>
---
 ShellPkg/Application/Shell/ShellParametersProtocol.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.c 
b/ShellPkg/Application/Shell/ShellParametersProtocol.c
index b404987..b96405d 100644
--- a/ShellPkg/Application/Shell/ShellParametersProtocol.c
+++ b/ShellPkg/Application/Shell/ShellParametersProtocol.c
@@ -195,6 +195,7 @@ ParseCommandLineToArgs(
   CHAR16      *TempParameter;
   CHAR16      *Walker;
   CHAR16      *NewParam;
+  CHAR16      *NewCommandLine;
   UINTN       Size;
 
   ASSERT(Argc != NULL);
@@ -206,15 +207,22 @@ ParseCommandLineToArgs(
     return (EFI_SUCCESS);
   }
 
-  TrimSpaces(&(CHAR16*)CommandLine);
-  Size = StrSize(CommandLine);
+  NewCommandLine = AllocateCopyPool(StrSize(CommandLine), CommandLine);
+  if (NewCommandLine == NULL){
+      SHELL_FREE_NON_NULL(NewCommandLine);
+      return (EFI_OUT_OF_RESOURCES);
+  }
+
+  TrimSpaces(&NewCommandLine);
+  Size = StrSize(NewCommandLine);
   TempParameter = AllocateZeroPool(Size);
   if (TempParameter == NULL) {
+    SHELL_FREE_NON_NULL(NewCommandLine);
     return (EFI_OUT_OF_RESOURCES);
   }
 
   for ( Count = 0
-      , Walker = (CHAR16*)CommandLine
+      , Walker = (CHAR16*)NewCommandLine
       ; Walker != NULL && *Walker != CHAR_NULL
       ; Count++
       ) {
@@ -229,21 +237,24 @@ ParseCommandLineToArgs(
   (*Argv) = AllocateZeroPool((Count)*sizeof(CHAR16*));
   if (*Argv == NULL) {
     SHELL_FREE_NON_NULL(TempParameter);
+    SHELL_FREE_NON_NULL(NewCommandLine);
     return (EFI_OUT_OF_RESOURCES);
   }
 
   *Argc = 0;
-  Walker = (CHAR16*)CommandLine;
+  Walker = (CHAR16*)NewCommandLine;
   while(Walker != NULL && *Walker != CHAR_NULL) {
     SetMem16(TempParameter, Size, CHAR_NULL);
     if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {
       SHELL_FREE_NON_NULL(TempParameter);
+      SHELL_FREE_NON_NULL(NewCommandLine);
       return (EFI_INVALID_PARAMETER);
     }
 
     NewParam = AllocateCopyPool(StrSize(TempParameter), TempParameter);
     if (NewParam == NULL){
       SHELL_FREE_NON_NULL(TempParameter);
+      SHELL_FREE_NON_NULL(NewCommandLine);
       return (EFI_OUT_OF_RESOURCES);
     }
     ((CHAR16**)(*Argv))[(*Argc)] = NewParam;
@@ -251,6 +262,7 @@ ParseCommandLineToArgs(
   }
   ASSERT(Count >= (*Argc));
   SHELL_FREE_NON_NULL(TempParameter);
+  SHELL_FREE_NON_NULL(NewCommandLine);
   return (EFI_SUCCESS);
 }
 
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to