1) RunSplitCommand() allocates the initial SplitStdOut via CreateFileInterfaceMem(). Free SplitStdIn after the swap to fix the memory leak.
2) In RunSplitCommand(), SplitStdOut is checked for equality with StdIn. This cannot happen due to the if-check within the swap. Hence remove it. 3) UefiMain() doesn't free SplitList. Delete all list entries and reinitialize the list when in DEBUG. This does not include the CreateFileInterfaceMem()-allocated SplitStd mentioned in 1), so keep the ASSERT() until resolved. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Marvin Haeuser <marvin.haeu...@outlook.com> --- ShellPkg/Application/Shell/Shell.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 47b3118ea701..a562c9a2c0bc 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -342,6 +342,7 @@ UefiMain ( UINTN Size; EFI_HANDLE ConInHandle; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *OldConIn; + SPLIT_LIST *Split; if (PcdGet8(PcdShellSupportLevel) > 3) { return (EFI_UNSUPPORTED); @@ -675,7 +676,17 @@ FreeResources: } if (!IsListEmpty(&ShellInfoObject.SplitList.Link)){ - ASSERT(FALSE); ///@todo finish this de-allocation. + ASSERT(FALSE); ///@todo finish this de-allocation (free SplitStdIn/Out when needed). + + for ( Split = (SPLIT_LIST*)GetFirstNode (&ShellInfoObject.SplitList.Link) + ; !IsNull (&ShellInfoObject.SplitList.Link, &Split->Link) + ; Split = (SPLIT_LIST *)GetNextNode (&ShellInfoObject.SplitList.Link, &Split->Link) + ) { + RemoveEntryList (&Split->Link); + FreePool (Split); + } + + DEBUG_CODE (InitializeListHead (&ShellInfoObject.SplitList.Link);); } if (ShellInfoObject.ShellInitSettings.FileName != NULL) { @@ -1736,11 +1747,12 @@ RunSplitCommand( // // Note that the original StdIn is now the StdOut... // - if (Split->SplitStdOut != NULL && Split->SplitStdOut != StdIn) { + if (Split->SplitStdOut != NULL) { ShellInfoObject.NewEfiShellProtocol->CloseFile(ConvertShellHandleToEfiFileProtocol(Split->SplitStdOut)); } if (Split->SplitStdIn != NULL) { ShellInfoObject.NewEfiShellProtocol->CloseFile(ConvertShellHandleToEfiFileProtocol(Split->SplitStdIn)); + FreePool (Split->SplitStdIn); } FreePool(Split); -- 2.7.4.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel