Difference with the 1st 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.

Difference with the 2nd version
Remove the redundant code.

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>
---
 .../Application/Shell/ShellParametersProtocol.c    | 34 +++++++++++++++-------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.c 
b/ShellPkg/Application/Shell/ShellParametersProtocol.c
index b404987..cd16140 100644
--- a/ShellPkg/Application/Shell/ShellParametersProtocol.c
+++ b/ShellPkg/Application/Shell/ShellParametersProtocol.c
@@ -195,7 +195,9 @@ ParseCommandLineToArgs(
   CHAR16      *TempParameter;
   CHAR16      *Walker;
   CHAR16      *NewParam;
+  CHAR16      *NewCommandLine;
   UINTN       Size;
+  EFI_STATUS  Status;
 
   ASSERT(Argc != NULL);
   ASSERT(Argv != NULL);
@@ -206,15 +208,21 @@ ParseCommandLineToArgs(
     return (EFI_SUCCESS);
   }
 
-  TrimSpaces(&(CHAR16*)CommandLine);
-  Size = StrSize(CommandLine);
+  NewCommandLine = AllocateCopyPool(StrSize(CommandLine), CommandLine);
+  if (NewCommandLine == NULL){
+    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++
       ) {
@@ -228,30 +236,34 @@ ParseCommandLineToArgs(
   //
   (*Argv) = AllocateZeroPool((Count)*sizeof(CHAR16*));
   if (*Argv == NULL) {
-    SHELL_FREE_NON_NULL(TempParameter);
-    return (EFI_OUT_OF_RESOURCES);
+    Status = EFI_OUT_OF_RESOURCES;
+    goto Done;
   }
 
   *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);
-      return (EFI_INVALID_PARAMETER);
+      Status = EFI_INVALID_PARAMETER;
+      goto Done;
     }
 
     NewParam = AllocateCopyPool(StrSize(TempParameter), TempParameter);
     if (NewParam == NULL){
-      SHELL_FREE_NON_NULL(TempParameter);
-      return (EFI_OUT_OF_RESOURCES);
+      Status = EFI_OUT_OF_RESOURCES;
+      goto Done;
     }
     ((CHAR16**)(*Argv))[(*Argc)] = NewParam;
     (*Argc)++;
   }
   ASSERT(Count >= (*Argc));
+  Status = EFI_SUCCESS;
+  
+Done:
   SHELL_FREE_NON_NULL(TempParameter);
-  return (EFI_SUCCESS);
+  SHELL_FREE_NON_NULL(NewCommandLine);
+  return (Status);
 }
 
 /**
-- 
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