Good catch. Reviewed-by: Jaben Carsey <[email protected]>
> -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of > Cecil Sheng > Sent: Tuesday, November 17, 2015 4:19 PM > To: [email protected] > Cc: Cecil Sheng <[email protected]> > Subject: [edk2] [PATCH] ShellPkg: Corrected CatSPrint usage to prevent > memory leaks. > Importance: High > > 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]> > --- > .../UefiHandleParsingLib/UefiHandleParsingLib.c | 231 +++++++++++--------- > - > 1 file changed, 122 insertions(+), 109 deletions(-) > > diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c > b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c > index b6ce509..5f4cc05 100644 > --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c > +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c > @@ -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 @@ HandleParsingLibConstructor ( > return (EFI_SUCCESS); > } > > -/** > +/** > Initialization function for HII packages. > - > + > **/ > VOID > HandleParsingHiiInit (VOID) > @@ -180,10 +181,7 @@ LoadedImageProtocolDumpInformation( > 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; > } > > @@ -205,22 +203,24 @@ LoadedImageProtocolDumpInformation( > 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 +258,7 @@ GraphicsOutputProtocolDumpInformation( > 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 +273,29 @@ GraphicsOutputProtocolDumpInformation( > > 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 +353,7 @@ PciRootBridgeIoDumpInformation( > 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 +373,13 @@ PciRootBridgeIoDumpInformation( > 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 +426,7 @@ PciRootBridgeIoDumpInformation( > Temp2 = NULL; > } > > - Temp2 = CatSPrint(RetVal, > + Temp2 = CatSPrint(RetVal, > L"%H%02x %016lx %016lx %02x%N\r\n", > Configuration->SpecificFlag, > Configuration->AddrRangeMin, > @@ -618,23 +615,17 @@ AdapterInformationDumpInformation ( > 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), > @@ -646,7 +637,6 @@ AdapterInformationDumpInformation ( > ); > > if (EFI_ERROR (Status)) { > - SHELL_FREE_NON_NULL (RetVal); > return NULL; > } > > @@ -655,22 +645,23 @@ AdapterInformationDumpInformation ( > // > 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 +669,9 @@ AdapterInformationDumpInformation ( > 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 +680,42 @@ AdapterInformationDumpInformation ( > } > > 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 +730,67 @@ AdapterInformationDumpInformation ( > 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 +834,7 @@ STATIC CONST EFI_GUID WinNtSerialPortGuid = > LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID > #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 +1303,9 @@ GetGuidFromStringName( > > /** > 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 +1703,7 @@ ParseHandleDatabaseByRelationshipWithType ( > > 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++) { > @@ -2238,7 +2251,7 @@ GetHandleListByProtocolList ( > } > > // > - // No handles were found... > + // No handles were found... > // > if (TotalSize == sizeof(EFI_HANDLE)) { > return (NULL); > -- > 1.9.4.msysgit.1 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

