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