Free the buffer node allocated by command code in 'BufferToFreeList' to avoid memory leak.
Cc: Jaben Carsey <[email protected]> Cc: Ruiyu Ni <[email protected]> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin <[email protected]> --- ShellPkg/Application/Shell/Shell.c | 41 ++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 41c8a03..7964794 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -2476,10 +2476,21 @@ RunShellCommand( CHAR16 *FirstParameter; CHAR16 *TempWalker; SHELL_OPERATION_TYPES Type; + LIST_ENTRY *BufferListEntry; + LIST_ENTRY *BufferListExit; + BUFFER_LIST *TempNode; + LIST_ENTRY *Walker; + // + // Record the last node in free buffer node + // + + BufferListEntry = ShellInfoObject.BufferToFreeList.Link.BackLink; + ASSERT(CmdLine != NULL); if (StrLen(CmdLine) == 0) { - return (EFI_SUCCESS); + Status = EFI_SUCCESS; + goto Exit; } Status = EFI_SUCCESS; @@ -2487,7 +2498,9 @@ RunShellCommand( CleanOriginal = StrnCatGrow(&CleanOriginal, NULL, CmdLine, 0); if (CleanOriginal == NULL) { - return (EFI_OUT_OF_RESOURCES); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } TrimSpaces(&CleanOriginal); @@ -2515,13 +2528,17 @@ RunShellCommand( // if (StrLen (CleanOriginal) == 0) { SHELL_FREE_NON_NULL(CleanOriginal); - return (EFI_SUCCESS); + Status = EFI_SUCCESS; + goto Exit; + } Status = ProcessCommandLineToFinal(&CleanOriginal); if (EFI_ERROR(Status)) { SHELL_FREE_NON_NULL(CleanOriginal); - return (Status); + + goto Exit; + } // @@ -2530,16 +2547,18 @@ RunShellCommand( if (ContainsSplit(CleanOriginal)) { Status = ProcessNewSplitCommandLine(CleanOriginal); SHELL_FREE_NON_NULL(CleanOriginal); - return (Status); + goto Exit; } + // // We need the first parameter information so we can determine the operation type // FirstParameter = AllocateZeroPool(StrSize(CleanOriginal)); if (FirstParameter == NULL) { SHELL_FREE_NON_NULL(CleanOriginal); - return (EFI_OUT_OF_RESOURCES); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; } TempWalker = CleanOriginal; if (!EFI_ERROR(GetNextParameter(&TempWalker, &FirstParameter, StrSize(CleanOriginal), TRUE))) { @@ -2571,6 +2590,16 @@ RunShellCommand( SHELL_FREE_NON_NULL(CleanOriginal); SHELL_FREE_NON_NULL(FirstParameter); +Exit: + BufferListExit = ShellInfoObject.BufferToFreeList.Link.BackLink; + for(Walker = BufferListExit; Walker != BufferListEntry; ) { + TempNode = (BUFFER_LIST *)Walker; + Walker = Walker->BackLink; + RemoveEntryList(&TempNode->Link); + SHELL_FREE_NON_NULL(TempNode->Buffer); + SHELL_FREE_NON_NULL(TempNode); + } + return (Status); } -- 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

