summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin H?user <Marvin.Haeuser@outlook.com>2016-05-20 03:04:02 +0800
committerQiu Shumin <shumin.qiu@intel.com>2016-05-25 10:16:46 +0800
commitbd3fc8133b2b17ad2e0427d1bf6b44b08cf2f3b2 (patch)
treedeff7cd5734e2a08add8dbb4cdf05dc2a9d0ec4d
parentdc99315b8732b6e3032d01319d3f534d440b43d0 (diff)
downloadedk2-bd3fc8133b2b17ad2e0427d1bf6b44b08cf2f3b2.zip
edk2-bd3fc8133b2b17ad2e0427d1bf6b44b08cf2f3b2.tar.gz
edk2-bd3fc8133b2b17ad2e0427d1bf6b44b08cf2f3b2.tar.bz2
ShellPkg/App: Fix memory leak and save resources.
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.Haeuser@outlook.com> Reviewed-by: Qiu Shumin <shumin.qiu@intel.com>
-rw-r--r--ShellPkg/Application/Shell/Shell.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c
index 2c56409..54ca76a 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) {
@@ -1743,11 +1754,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);