Reviewed-by: Ruiyu Ni <[email protected]>

-----Original Message-----
From: Qiu, Shumin 
Sent: Wednesday, December 23, 2015 3:36 PM
To: [email protected]
Cc: Qiu, Shumin <[email protected]>; Carsey, Jaben <[email protected]>; 
Ni, Ruiyu <[email protected]>
Subject: [PATCH] ShellPkg: Free memory in 'BufferToFreeList' before return from 
RunShellCommand.

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

Reply via email to