diff options
author | Marvin H?user <Marvin.Haeuser@outlook.com> | 2016-05-20 03:04:02 +0800 |
---|---|---|
committer | Qiu Shumin <shumin.qiu@intel.com> | 2016-05-25 10:16:46 +0800 |
commit | bd3fc8133b2b17ad2e0427d1bf6b44b08cf2f3b2 (patch) | |
tree | deff7cd5734e2a08add8dbb4cdf05dc2a9d0ec4d /ShellPkg | |
parent | dc99315b8732b6e3032d01319d3f534d440b43d0 (diff) | |
download | edk2-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>
Diffstat (limited to 'ShellPkg')
-rw-r--r-- | ShellPkg/Application/Shell/Shell.c | 16 |
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);
|