Revision: 18902
          http://sourceforge.net/p/edk2/code/18902
Author:   shenshushi
Date:     2015-11-19 08:37:03 +0000 (Thu, 19 Nov 2015)
Log Message:
-----------
ShellPkg: Corrected CatSPrint usage to prevent memory leaks.

CatSPrint allocates return buffer for the caller. The caller doesn't have to 
allocate one, and has to free the used buffers.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Cecil Sheng <[email protected]>
Reviewed-by: Qiu Shumin <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c

Modified: 
trunk/edk2/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
===================================================================
--- trunk/edk2/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c     
2015-11-19 02:32:03 UTC (rev 18901)
+++ trunk/edk2/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c     
2015-11-19 08:37:03 UTC (rev 18902)
@@ -1,6 +1,7 @@
 /** @file
   Provides interface to advanced shell functionality for parsing both handle 
and protocol database.
 
+  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
   Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials
@@ -108,9 +109,9 @@
   return (EFI_SUCCESS);
 }
 
-/** 
+/**
   Initialization function for HII packages.
- 
+
 **/
 VOID
 HandleParsingHiiInit (VOID)
@@ -180,10 +181,7 @@
   HandleParsingHiiInit();
 
   Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), 
NULL);
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));
-  if (Temp == NULL || RetVal == NULL) {
-    SHELL_FREE_NON_NULL(Temp);
-    SHELL_FREE_NON_NULL(RetVal);
+  if (Temp == NULL) {
     return NULL;
   }
 
@@ -198,29 +196,30 @@
 
   if (EFI_ERROR (Status)) {
     SHELL_FREE_NON_NULL (Temp);
-    SHELL_FREE_NON_NULL (RetVal);
     return NULL;
   }
 
   DataType = ConvertMemoryType(LoadedImage->ImageDataType);
   CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);
 
-  RetVal = CatSPrint(RetVal,
-                      Temp,
-                      LoadedImage->Revision,
-                      LoadedImage->ParentHandle,
-                      LoadedImage->SystemTable,
-                      LoadedImage->DeviceHandle,
-                      LoadedImage->FilePath,
-                      LoadedImage->LoadOptionsSize,
-                      LoadedImage->LoadOptions,
-                      LoadedImage->ImageBase,
-                      LoadedImage->ImageSize,
-                      CodeType,
-                      DataType,
-                      LoadedImage->Unload);
+  RetVal = CatSPrint(
+             NULL,
+             Temp,
+             LoadedImage->Revision,
+             LoadedImage->ParentHandle,
+             LoadedImage->SystemTable,
+             LoadedImage->DeviceHandle,
+             LoadedImage->FilePath,
+             LoadedImage->LoadOptionsSize,
+             LoadedImage->LoadOptions,
+             LoadedImage->ImageBase,
+             LoadedImage->ImageSize,
+             CodeType,
+             DataType,
+             LoadedImage->Unload
+             );
 
-  
+
   SHELL_FREE_NON_NULL(Temp);
   SHELL_FREE_NON_NULL(CodeType);
   SHELL_FREE_NON_NULL(DataType);
@@ -258,10 +257,7 @@
   HandleParsingHiiInit();
 
   Temp = HiiGetString(mHandleParsingHiiHandle, 
STRING_TOKEN(STR_GOP_DUMP_MAIN), NULL);
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));
-  if (Temp == NULL || RetVal == NULL) {
-    SHELL_FREE_NON_NULL(Temp);
-    SHELL_FREE_NON_NULL(RetVal);
+  if (Temp == NULL) {
     return NULL;
   }
 
@@ -276,29 +272,29 @@
 
   if (EFI_ERROR (Status)) {
     SHELL_FREE_NON_NULL (Temp);
-    SHELL_FREE_NON_NULL (RetVal);
     return NULL;
   }
 
   Fmt = ConvertPixelFormat(GraphicsOutput->Mode->Info->PixelFormat);
 
-  RetVal = CatSPrint(RetVal,
-                      Temp,
-                      GraphicsOutput->Mode->MaxMode,
-                      GraphicsOutput->Mode->Mode,
-                      GraphicsOutput->Mode->FrameBufferBase,
-                      (UINT64)GraphicsOutput->Mode->FrameBufferSize,
-                      (UINT64)GraphicsOutput->Mode->SizeOfInfo,
-                      GraphicsOutput->Mode->Info->Version,
-                      GraphicsOutput->Mode->Info->HorizontalResolution,
-                      GraphicsOutput->Mode->Info->VerticalResolution,
-                      Fmt,
-                      GraphicsOutput->Mode->Info->PixelsPerScanLine,
-                      
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,
-                      
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,
-                      
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask
-                      );
-  
+  RetVal = CatSPrint(
+             NULL,
+             Temp,
+             GraphicsOutput->Mode->MaxMode,
+             GraphicsOutput->Mode->Mode,
+             GraphicsOutput->Mode->FrameBufferBase,
+             (UINT64)GraphicsOutput->Mode->FrameBufferSize,
+             (UINT64)GraphicsOutput->Mode->SizeOfInfo,
+             GraphicsOutput->Mode->Info->Version,
+             GraphicsOutput->Mode->Info->HorizontalResolution,
+             GraphicsOutput->Mode->Info->VerticalResolution,
+             Fmt,
+             GraphicsOutput->Mode->Info->PixelsPerScanLine,
+             
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,
+             
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,
+             
GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask
+             );
+
   SHELL_FREE_NON_NULL(Temp);
   SHELL_FREE_NON_NULL(Fmt);
 
@@ -356,7 +352,7 @@
   FreePool(Temp);
   RetVal = Temp2;
   Temp2 = NULL;
- 
+
   Temp = HiiGetString(mHandleParsingHiiHandle, 
STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);
   if (Temp == NULL) {
     SHELL_FREE_NON_NULL(RetVal);
@@ -376,13 +372,13 @@
     if (Temp == NULL) {
       SHELL_FREE_NON_NULL(RetVal);
       return NULL;
-    }    
+    }
     Temp2 = CatSPrint(RetVal, Temp, Attributes);
     FreePool(Temp);
     FreePool(RetVal);
     RetVal = Temp2;
     Temp2 = NULL;
-    
+
     Temp = HiiGetString(mHandleParsingHiiHandle, 
STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);
     if (Temp == NULL) {
       SHELL_FREE_NON_NULL(RetVal);
@@ -429,7 +425,7 @@
         Temp2 = NULL;
       }
 
-      Temp2 = CatSPrint(RetVal, 
+      Temp2 = CatSPrint(RetVal,
         L"%H%02x    %016lx  %016lx  %02x%N\r\n",
         Configuration->SpecificFlag,
         Configuration->AddrRangeMin,
@@ -618,24 +614,18 @@
   CHAR16                            *GuidStr;
   CHAR16                            *TempStr;
   CHAR16                            *RetVal;
+  CHAR16                            *TempRetVal;
   VOID                              *InformationBlock;
   UINTN                             InformationBlockSize;
-   
+
   if (!Verbose) {
     return (CatSPrint(NULL, L"AdapterInfo"));
   }
 
   InfoTypesBuffer   = NULL;
   InformationBlock  = NULL;
-  
-  //
-  // Allocate print buffer to store data
-  //
-  RetVal = AllocateZeroPool (PcdGet16(PcdShellPrintBufferSize));
-  if (RetVal == NULL) {
-    return NULL;
-  }
 
+
   Status = gBS->OpenProtocol (
                   (EFI_HANDLE) (TheHandle),
                   &gEfiAdapterInformationProtocolGuid,
@@ -646,7 +636,6 @@
                   );
 
   if (EFI_ERROR (Status)) {
-    SHELL_FREE_NON_NULL (RetVal);
     return NULL;
   }
 
@@ -655,22 +644,23 @@
   //
   Status = EfiAdptrInfoProtocol->GetSupportedTypes (
                                    EfiAdptrInfoProtocol,
-                                   &InfoTypesBuffer, 
+                                   &InfoTypesBuffer,
                                    &InfoTypesBufferCount
                                    );
+  RetVal = NULL;
   if (EFI_ERROR (Status)) {
     TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED), NULL);
     if (TempStr != NULL) {
-      RetVal = CatSPrint (RetVal, TempStr, Status);
+      RetVal = CatSPrint (NULL, TempStr, Status);
     } else {
       goto ERROR_EXIT;
-    }  
+    }
   } else {
     TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_SUPP_TYPE_HEADER), NULL);
     if (TempStr == NULL) {
       goto ERROR_EXIT;
     }
-    RetVal = CatSPrint (RetVal, TempStr);
+    RetVal = CatSPrint (NULL, TempStr);
     SHELL_FREE_NON_NULL (TempStr);
 
     for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {
@@ -678,7 +668,9 @@
       if (TempStr == NULL) {
         goto ERROR_EXIT;
       }
-      RetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), 
InfoTypesBuffer[GuidIndex]);
+      TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), 
InfoTypesBuffer[GuidIndex]);
+      SHELL_FREE_NON_NULL (RetVal);
+      RetVal = TempRetVal;
       SHELL_FREE_NON_NULL (TempStr);
 
       TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_GUID_STRING), NULL);
@@ -687,32 +679,42 @@
       }
 
       if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoMediaStateGuid)) {
-        RetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");
+        TempRetVal = CatSPrint (RetVal, TempStr, 
L"gEfiAdapterInfoMediaStateGuid");
+        SHELL_FREE_NON_NULL (RetVal);
+        RetVal = TempRetVal;
       } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoNetworkBootGuid)) {
-        RetVal = CatSPrint (RetVal, TempStr, 
L"gEfiAdapterInfoNetworkBootGuid");
+        TempRetVal = CatSPrint (RetVal, TempStr, 
L"gEfiAdapterInfoNetworkBootGuid");
+        SHELL_FREE_NON_NULL (RetVal);
+        RetVal = TempRetVal;
       } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoSanMacAddressGuid)) {
-        RetVal = CatSPrint (RetVal, TempStr, 
L"gEfiAdapterInfoSanMacAddressGuid");
+        TempRetVal = CatSPrint (RetVal, TempStr, 
L"gEfiAdapterInfoSanMacAddressGuid");
+        SHELL_FREE_NON_NULL (RetVal);
+        RetVal = TempRetVal;
       } else {
 
         GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);
-       
+
         if (GuidStr != NULL) {
           if (StrCmp(GuidStr, L"UnknownDevice") == 0) {
-            RetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");
-            
+            TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");
+            SHELL_FREE_NON_NULL (RetVal);
+            RetVal = TempRetVal;
+
             SHELL_FREE_NON_NULL (TempStr);
             SHELL_FREE_NON_NULL(GuidStr);
             //
             // So that we never have to pass this UnknownInfoType to the 
parsing function "GetInformation" service of AIP
             //
-            continue; 
+            continue;
           } else {
-            RetVal = CatSPrint (RetVal, TempStr, GuidStr);
+            TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);
+            SHELL_FREE_NON_NULL (RetVal);
+            RetVal = TempRetVal;
             SHELL_FREE_NON_NULL(GuidStr);
           }
         }
       }
-      
+
       SHELL_FREE_NON_NULL (TempStr);
 
       Status = EfiAdptrInfoProtocol->GetInformation (
@@ -727,57 +729,67 @@
         if (TempStr == NULL) {
           goto ERROR_EXIT;
         }
-        RetVal = CatSPrint (RetVal, TempStr, Status);
+        TempRetVal = CatSPrint (RetVal, TempStr, Status);
+        SHELL_FREE_NON_NULL (RetVal);
+        RetVal = TempRetVal;
       } else {
         if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoMediaStateGuid)) {
           TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_MEDIA_STATE), NULL);
           if (TempStr == NULL) {
             goto ERROR_EXIT;
           }
-          RetVal = CatSPrint (
-                     RetVal,
-                     TempStr,
-                     ((EFI_ADAPTER_INFO_MEDIA_STATE 
*)InformationBlock)->MediaState,
-                     ((EFI_ADAPTER_INFO_MEDIA_STATE 
*)InformationBlock)->MediaState
-                     );
+          TempRetVal = CatSPrint (
+                         RetVal,
+                         TempStr,
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE 
*)InformationBlock)->MediaState,
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE 
*)InformationBlock)->MediaState
+                         );
+          SHELL_FREE_NON_NULL (RetVal);
+          RetVal = TempRetVal;
         } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoNetworkBootGuid)) {
           TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_NETWORK_BOOT_INFO), NULL);
           if (TempStr == NULL) {
             goto ERROR_EXIT;
           }
-          RetVal = CatSPrint (
-                     RetVal,
-                     TempStr,
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv4BootCapablity,
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv6BootCapablity, 
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->FCoeBootCapablity, 
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->OffloadCapability, 
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiMpioCapability, 
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv4Boot, 
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv6Boot,
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->FCoeBoot
-                     );
-        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoSanMacAddressGuid) == TRUE) { 
+          TempRetVal = CatSPrint (
+                         RetVal,
+                         TempStr,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv4BootCapablity,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv6BootCapablity,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->FCoeBootCapablity,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->OffloadCapability,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiMpioCapability,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv4Boot,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->iScsiIpv6Boot,
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT 
*)InformationBlock)->FCoeBoot
+                         );
+          SHELL_FREE_NON_NULL (RetVal);
+          RetVal = TempRetVal;
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], 
&gEfiAdapterInfoSanMacAddressGuid) == TRUE) {
           TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO), NULL);
           if (TempStr == NULL) {
             goto ERROR_EXIT;
           }
-          RetVal = CatSPrint (
-                     RetVal,
-                     TempStr,
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[0], 
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[1], 
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[2],
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[3], 
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[4], 
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[5]
-                     );   
+          TempRetVal = CatSPrint (
+                         RetVal,
+                         TempStr,
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[0],
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[1],
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[2],
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[3],
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[4],
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS 
*)InformationBlock)->SanMacAddress.Addr[5]
+                         );
+          SHELL_FREE_NON_NULL (RetVal);
+          RetVal = TempRetVal;
         } else {
           TempStr = HiiGetString (mHandleParsingHiiHandle, 
STRING_TOKEN(STR_UNKNOWN_INFO_TYPE), NULL);
           if (TempStr == NULL) {
             goto ERROR_EXIT;
           }
-          RetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);
+          TempRetVal = CatSPrint (RetVal, TempStr, 
&InfoTypesBuffer[GuidIndex]);
+          SHELL_FREE_NON_NULL (RetVal);
+          RetVal = TempRetVal;
         }
       }
       SHELL_FREE_NON_NULL (TempStr);
@@ -821,7 +833,7 @@
 #define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \
   { \
   0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d 
} \
-  } 
+  }
 #define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \
   { \
   0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 
} \
@@ -1290,9 +1302,9 @@
 
 /**
   Get best support language for this driver.
-  
-  First base on the user input language  to search, second base on the current 
-  platform used language to search, third get the first language from the 
+
+  First base on the user input language  to search, second base on the current
+  platform used language to search, third get the first language from the
   support language list. The caller need to free the buffer of the best 
language.
 
   @param[in] SupportedLanguages      The support languages for this driver.
@@ -1690,7 +1702,7 @@
 
       if (ControllerHandle == NULL) {
         //
-        // ControllerHandle == NULL and DriverBindingHandle != NULL.  
+        // ControllerHandle == NULL and DriverBindingHandle != NULL.
         // Return information on all the controller handles that the driver 
specified by DriverBindingHandle is managing
         //
         for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to