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 <[email protected]> Cc: Ruiyu Ni <[email protected]> Cc: Yang Jadis <[email protected]> Cc: Ard Biesheuvel <[email protected]> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin <[email protected]> --- 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 [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

