> -----Original Message----- > From: Ni, Ruiyu > Sent: Thursday, July 14, 2016 2:30 AM > To: edk2-devel@lists.01.org > Cc: Carsey, Jaben <jaben.car...@intel.com> > Subject: [PATCH 08/27] ShellPkg/ConsistMapping.c: Handle memory > allocation failure > Importance: High > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ruiyu Ni <ruiyu...@intel.com> > Cc: Jaben Carsey <jaben.car...@intel.com> > --- > .../Library/UefiShellCommandLib/ConsistMapping.c | 497 +++++++++++++- > ------- > 1 file changed, 319 insertions(+), 178 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c > b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c > index 41754dd..82d4f1f 100644 > --- a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c > +++ b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c > @@ -53,10 +53,12 @@ typedef struct { > @param MapInfo The map info. > @param OrigDevPath The original device path protocol. > > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > typedef > -VOID > -(EFIAPI *SERIAL_DECODE_FUNCTION) ( > +EFI_STATUS > +(*SERIAL_DECODE_FUNCTION) ( > EFI_DEVICE_PATH_PROTOCOL *DevPath, > DEVICE_CONSIST_MAPPING_INFO *MapInfo, > EFI_DEVICE_PATH_PROTOCOL *OrigDevPath > @@ -78,13 +80,11 @@ typedef struct { > @param Fmt The format string > @param ... The data will be printed. > > - @return Allocated buffer with the formatted string printed in it. > - The caller must free the allocated buffer. > - The buffer allocation is not packed. > + @retval EFI_SUCCESS The string is concatenated successfully. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > > **/ > -CHAR16 * > -EFIAPI > +EFI_STATUS > CatPrint ( > IN OUT POOL_PRINT *Str, > IN CHAR16 *Fmt, > @@ -94,37 +94,40 @@ CatPrint ( > UINT16 *AppendStr; > VA_LIST Args; > UINTN StringSize; > + CHAR16 *NewStr; > > AppendStr = AllocateZeroPool (0x1000); > if (AppendStr == NULL) { > - ASSERT(FALSE); > - return Str->Str; > + return EFI_OUT_OF_RESOURCES; > } > > VA_START (Args, Fmt); > UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args); > VA_END (Args); > if (NULL == Str->Str) { > - StringSize = StrSize (AppendStr); > - Str->Str = AllocateZeroPool (StringSize); > - ASSERT (Str->Str != NULL); > + StringSize = StrSize (AppendStr); > + NewStr = AllocateZeroPool (StringSize); > } else { > StringSize = StrSize (AppendStr); > StringSize += (StrSize (Str->Str) - sizeof (UINT16)); > > - Str->Str = ReallocatePool ( > - StrSize (Str->Str), > - StringSize, > - Str->Str > + NewStr = ReallocatePool ( > + StrSize (Str->Str), > + StringSize, > + Str->Str > ); > - ASSERT (Str->Str != NULL); > + } > + if (NewStr == NULL) { > + FreePool (AppendStr); > + return EFI_OUT_OF_RESOURCES; > } > > + Str->Str = NewStr; > StrCatS (Str->Str, StringSize/sizeof(CHAR16), AppendStr); > Str->Len = StringSize; > > FreePool (AppendStr); > - return Str->Str; > + return EFI_SUCCESS; > } > > MTD_NAME mMTDName[] = { > @@ -156,30 +159,30 @@ MTD_NAME mMTDName[] = { > @param[in, out] Str The string so append onto. > @param[in] Num The number to divide and append. > > - @retval EFI_INVALID_PARAMETER A parameter was NULL. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > @retval EFI_SUCCESS The appending was successful. > **/ > EFI_STATUS > -EFIAPI > AppendCSDNum2 ( > IN OUT POOL_PRINT *Str, > IN UINT64 Num > ) > { > - UINT64 Result; > - UINT32 Rem; > + EFI_STATUS Status; > + UINT64 Result; > + UINT32 Rem; > > - if (Str == NULL) { > - return (EFI_INVALID_PARAMETER); > - } > + ASSERT (Str != NULL); > > Result = DivU64x32Remainder (Num, 25, &Rem); > if (Result > 0) { > - AppendCSDNum2 (Str, Result); > + Status = AppendCSDNum2 (Str, Result); > + if (EFI_ERROR (Status)) { > + return Status; > + } > } > > - CatPrint (Str, L"%c", Rem + 'a'); > - return (EFI_SUCCESS); > + return CatPrint (Str, L"%c", Rem + 'a'); > } > > /** > @@ -188,29 +191,30 @@ AppendCSDNum2 ( > @param[in, out] MappingItem The mapping info object to append onto. > @param[in] Num The info to append. > > - @retval EFI_INVALID_PARAMETER A parameter was NULL. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > @retval EFI_SUCCESS The appending was successful. > + > **/ > EFI_STATUS > -EFIAPI > AppendCSDNum ( > IN OUT DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN UINT64 Num > ) > { > - if (MappingItem == NULL) { > - return EFI_INVALID_PARAMETER; > - } > + EFI_STATUS Status; > + ASSERT (MappingItem != NULL); > > if (MappingItem->Digital) { > - CatPrint (&MappingItem->Csd, L"%ld", Num); > + Status = CatPrint (&MappingItem->Csd, L"%ld", Num); > } else { > - AppendCSDNum2 (&MappingItem->Csd, Num); > + Status = AppendCSDNum2 (&MappingItem->Csd, Num); > } > > - MappingItem->Digital = (BOOLEAN)!(MappingItem->Digital); > + if (!EFI_ERROR (Status)) { > + MappingItem->Digital = (BOOLEAN) !(MappingItem->Digital); > + } > > - return (EFI_SUCCESS); > + return Status; > } > > /** > @@ -219,21 +223,21 @@ AppendCSDNum ( > @param[in, out] MappingItem The mapping info object to append onto. > @param[in] Str The info to append. > > - @retval EFI_INVALID_PARAMETER A parameter was NULL. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > @retval EFI_SUCCESS The appending was successful. > **/ > EFI_STATUS > -EFIAPI > AppendCSDStr ( > IN OUT DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN CHAR16 *Str > ) > { > - CHAR16 *Index; > + CHAR16 *Index; > + EFI_STATUS Status; > > - if (Str == NULL || MappingItem == NULL) { > - return (EFI_INVALID_PARAMETER); > - } > + ASSERT (Str != NULL && MappingItem != NULL); > + > + Status = EFI_SUCCESS; > > if (MappingItem->Digital) { > // > @@ -252,11 +256,11 @@ AppendCSDStr ( > case '7': > case '8': > case '9': > - CatPrint (&MappingItem->Csd, L"%c", *Index); > + Status = CatPrint (&MappingItem->Csd, L"%c", *Index); > break; > > case '1': > - CatPrint (&MappingItem->Csd, L"16"); > + Status = CatPrint (&MappingItem->Csd, L"16"); > break; > > case 'a': > @@ -265,7 +269,7 @@ AppendCSDStr ( > case 'd': > case 'e': > case 'f': > - CatPrint (&MappingItem->Csd, L"1%c", *Index - 'a' + '0'); > + Status = CatPrint (&MappingItem->Csd, L"1%c", *Index - 'a' + '0'); > break; > > case 'A': > @@ -274,9 +278,13 @@ AppendCSDStr ( > case 'D': > case 'E': > case 'F': > - CatPrint (&MappingItem->Csd, L"1%c", *Index - 'A' + '0'); > + Status = CatPrint (&MappingItem->Csd, L"1%c", *Index - 'A' + '0'); > break; > } > + > + if (EFI_ERROR (Status)) { > + return Status; > + } > } > } else { > for (Index = Str; *Index != 0; Index++) { > @@ -286,11 +294,15 @@ AppendCSDStr ( > // a b c d e f g h i j k l m n o p > // > if (*Index >= '0' && *Index <= '9') { > - CatPrint (&MappingItem->Csd, L"%c", *Index - '0' + 'a'); > + Status = CatPrint (&MappingItem->Csd, L"%c", *Index - '0' + 'a'); > } else if (*Index >= 'a' && *Index <= 'f') { > - CatPrint (&MappingItem->Csd, L"%c", *Index - 'a' + 'k'); > + Status = CatPrint (&MappingItem->Csd, L"%c", *Index - 'a' + 'k'); > } else if (*Index >= 'A' && *Index <= 'F') { > - CatPrint (&MappingItem->Csd, L"%c", *Index - 'A' + 'k'); > + Status = CatPrint (&MappingItem->Csd, L"%c", *Index - 'A' + 'k'); > + } > + > + if (EFI_ERROR (Status)) { > + return Status; > } > } > } > @@ -306,11 +318,10 @@ AppendCSDStr ( > @param[in, out] MappingItem The item to append onto. > @param[in] Guid The guid to append. > > - @retval EFI_SUCCESS The appending operation was successful. > - @retval EFI_INVALID_PARAMETER A parameter was NULL. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > EFI_STATUS > -EFIAPI > AppendCSDGuid ( > DEVICE_CONSIST_MAPPING_INFO *MappingItem, > EFI_GUID *Guid > @@ -318,9 +329,7 @@ AppendCSDGuid ( > { > CHAR16 Buffer[64]; > > - if (Guid == NULL || MappingItem == NULL) { > - return (EFI_INVALID_PARAMETER); > - } > + ASSERT (Guid != NULL && MappingItem != NULL); > > UnicodeSPrint ( > Buffer, > @@ -329,9 +338,7 @@ AppendCSDGuid ( > Guid > ); > > - AppendCSDStr (MappingItem, Buffer); > - > - return (EFI_SUCCESS); > + return AppendCSDStr (MappingItem, Buffer); > } > > /** > @@ -445,9 +452,11 @@ DevPathCompareDefault ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialHardDrive ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -464,7 +473,7 @@ DevPathSerialHardDrive ( > MappingItem->Mtd = MTDTypeHardDisk; > } > > - AppendCSDNum (MappingItem, Hd->PartitionNumber); > + return AppendCSDNum (MappingItem, Hd->PartitionNumber); > } > > /** > @@ -473,9 +482,11 @@ DevPathSerialHardDrive ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialAtapi ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -488,7 +499,7 @@ DevPathSerialAtapi ( > ASSERT(MappingItem != NULL); > > Atapi = (ATAPI_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, (Atapi->PrimarySecondary * 2 + Atapi- > >SlaveMaster)); > + return AppendCSDNum (MappingItem, (Atapi->PrimarySecondary * 2 + > Atapi->SlaveMaster)); > } > > /** > @@ -497,9 +508,11 @@ DevPathSerialAtapi ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialCdRom ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -513,7 +526,7 @@ DevPathSerialCdRom ( > > Cd = (CDROM_DEVICE_PATH *) DevicePathNode; > MappingItem->Mtd = MTDTypeCDRom; > - AppendCSDNum (MappingItem, Cd->BootEntry); > + return AppendCSDNum (MappingItem, Cd->BootEntry); > } > > /** > @@ -522,23 +535,29 @@ DevPathSerialCdRom ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialFibre ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > FIBRECHANNEL_DEVICE_PATH *Fibre; > > ASSERT(DevicePathNode != NULL); > ASSERT(MappingItem != NULL); > > Fibre = (FIBRECHANNEL_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Fibre->WWN); > - AppendCSDNum (MappingItem, Fibre->Lun); > + Status = AppendCSDNum (MappingItem, Fibre->WWN); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Fibre->Lun); > + } > + return Status; > } > > /** > @@ -547,25 +566,35 @@ DevPathSerialFibre ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialUart ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > - UART_DEVICE_PATH *Uart; > + EFI_STATUS Status; > + UART_DEVICE_PATH *Uart; > > ASSERT(DevicePathNode != NULL); > ASSERT(MappingItem != NULL); > > Uart = (UART_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Uart->BaudRate); > - AppendCSDNum (MappingItem, Uart->DataBits); > - AppendCSDNum (MappingItem, Uart->Parity); > - AppendCSDNum (MappingItem, Uart->StopBits); > + Status = AppendCSDNum (MappingItem, Uart->BaudRate); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Uart->DataBits); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Uart->Parity); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Uart->StopBits); > + } > + return Status; > } > > /** > @@ -574,9 +603,11 @@ DevPathSerialUart ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialUsb ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -594,8 +625,14 @@ DevPathSerialUsb ( > ASSERT(MappingItem != NULL); > > Usb = (USB_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Usb->ParentPortNumber); > - AppendCSDNum (MappingItem, Usb->InterfaceNumber); > + Status = AppendCSDNum (MappingItem, Usb->ParentPortNumber); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Usb->InterfaceNumber); > + } > + > + if (EFI_ERROR (Status)) { > + return Status; > + } > > if (PcdGetBool(PcdUsbExtendedDecode)) { > Status = gBS->LocateDevicePath( &gEfiUsbIoProtocolGuid, &DevicePath, > &TempHandle ); > @@ -625,6 +662,7 @@ DevPathSerialUsb ( > } > } > } > + return Status; > } > > /** > @@ -634,34 +672,45 @@ DevPathSerialUsb ( > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialVendor ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > VENDOR_DEVICE_PATH *Vendor; > SAS_DEVICE_PATH *Sas; > UINTN TargetNameLength; > UINTN Index; > CHAR16 *Buffer; > + CHAR16 *NewBuffer; > > - if (DevicePathNode == NULL || MappingItem == NULL) { > - return; > - } > + ASSERT(DevicePathNode != NULL); > + ASSERT(MappingItem != NULL); > > Vendor = (VENDOR_DEVICE_PATH *) DevicePathNode; > - AppendCSDGuid (MappingItem, &Vendor->Guid); > + Status = AppendCSDGuid (MappingItem, &Vendor->Guid); > + if (EFI_ERROR (Status)) { > + return Status; > + } > > if (CompareGuid (&gEfiSasDevicePathGuid, &Vendor->Guid)) { > Sas = (SAS_DEVICE_PATH *) Vendor; > - AppendCSDNum (MappingItem, Sas->SasAddress); > - AppendCSDNum (MappingItem, Sas->Lun); > - AppendCSDNum (MappingItem, Sas->DeviceTopology); > - AppendCSDNum (MappingItem, Sas->RelativeTargetPort); > + Status = AppendCSDNum (MappingItem, Sas->SasAddress); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Sas->Lun); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Sas->DeviceTopology); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Sas->RelativeTargetPort); > + } > } else { > TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - > sizeof (VENDOR_DEVICE_PATH), > PcdGet32(PcdShellVendorExtendedDecode)); > if (TargetNameLength != 0) { > @@ -669,26 +718,33 @@ DevPathSerialVendor ( > // String is 2 chars per data byte, plus NULL terminator > // > Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * > sizeof(CHAR16)); > - ASSERT(Buffer != NULL); > if (Buffer == NULL) { > - return; > - } > + return EFI_OUT_OF_RESOURCES; > + } > > // > // Build the string data > // > for (Index = 0; Index < TargetNameLength; Index++) { > - Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof > (VENDOR_DEVICE_PATH) + Index)); > -} > + NewBuffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof > (VENDOR_DEVICE_PATH) + Index)); > + if (NewBuffer == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + break; > + } > + Buffer = NewBuffer; > + } > > // > // Append the new data block > // > - AppendCSDStr (MappingItem, Buffer); > + if (!EFI_ERROR (Status)) { > + AppendCSDStr (MappingItem, Buffer);
I think the line above should be: Status = AppendCSDStr (MappingItem, Buffer); > + } > > FreePool(Buffer); > } > } > + return Status; > } > > /** > @@ -697,9 +753,11 @@ DevPathSerialVendor ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialLun ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -712,7 +770,7 @@ DevPathSerialLun ( > ASSERT(MappingItem != NULL); > > Lun = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Lun->Lun); > + return AppendCSDNum (MappingItem, Lun->Lun); > } > > /** > @@ -721,24 +779,32 @@ DevPathSerialLun ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialSata ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > SATA_DEVICE_PATH *Sata; > > ASSERT(DevicePathNode != NULL); > ASSERT(MappingItem != NULL); > > Sata = (SATA_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Sata->HBAPortNumber); > - AppendCSDNum (MappingItem, Sata->PortMultiplierPortNumber); > - AppendCSDNum (MappingItem, Sata->Lun); > + Status = AppendCSDNum (MappingItem, Sata->HBAPortNumber); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Sata- > >PortMultiplierPortNumber); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Sata->Lun); > + } > + return Status; > } > > /** > @@ -747,15 +813,18 @@ DevPathSerialSata ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialIScsi ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > ISCSI_DEVICE_PATH *IScsi; > UINT8 *IScsiTargetName; > CHAR16 *TargetName; > @@ -765,25 +834,39 @@ DevPathSerialIScsi ( > ASSERT(DevicePathNode != NULL); > ASSERT(MappingItem != NULL); > > + Status = EFI_SUCCESS; > + > if (PcdGetBool(PcdShellDecodeIScsiMapNames)) { > IScsi = (ISCSI_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, IScsi->NetworkProtocol); > - AppendCSDNum (MappingItem, IScsi->LoginOption); > - AppendCSDNum (MappingItem, IScsi->Lun); > - AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag); > + Status = AppendCSDNum (MappingItem, IScsi->NetworkProtocol); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, IScsi->LoginOption); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, IScsi->Lun); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag); > + } > + if (EFI_ERROR (Status)) { > + return Status; > + } > TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof > (ISCSI_DEVICE_PATH); > if (TargetNameLength > 0) { > TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof > (CHAR16)); > - if (TargetName != NULL) { > + if (TargetName == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + } else { > IScsiTargetName = (UINT8 *) (IScsi + 1); > for (Index = 0; Index < TargetNameLength; Index++) { > TargetName[Index] = (CHAR16) IScsiTargetName[Index]; > } > - AppendCSDStr (MappingItem, TargetName); > + Status = AppendCSDStr (MappingItem, TargetName); > FreePool (TargetName); > } > } > } > + return Status; > } > > /** > @@ -792,9 +875,11 @@ DevPathSerialIScsi ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialI2O ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -807,7 +892,7 @@ DevPathSerialI2O ( > ASSERT(MappingItem != NULL); > > DevicePath_I20 = (I2O_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, DevicePath_I20->Tid); > + return AppendCSDNum (MappingItem, DevicePath_I20->Tid); > } > > /** > @@ -816,9 +901,11 @@ DevPathSerialI2O ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialMacAddr ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -845,7 +932,7 @@ DevPathSerialMacAddr ( > UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Mac- > >MacAddress.Addr[Index]); > } > > - AppendCSDStr (MappingItem, Buffer); > + return AppendCSDStr (MappingItem, Buffer); > } > > /** > @@ -854,15 +941,18 @@ DevPathSerialMacAddr ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialInfiniBand ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > INFINIBAND_DEVICE_PATH *InfiniBand; > UINTN Index; > CHAR16 Buffer[64]; > @@ -876,10 +966,17 @@ DevPathSerialInfiniBand ( > UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) InfiniBand->PortGid[Index]); > } > > - AppendCSDStr (MappingItem, Buffer); > - AppendCSDNum (MappingItem, InfiniBand->ServiceId); > - AppendCSDNum (MappingItem, InfiniBand->TargetPortId); > - AppendCSDNum (MappingItem, InfiniBand->DeviceId); > + Status = AppendCSDStr (MappingItem, Buffer); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, InfiniBand->ServiceId); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, InfiniBand->TargetPortId); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, InfiniBand->DeviceId); > + } > + return Status; > } > > /** > @@ -888,15 +985,18 @@ DevPathSerialInfiniBand ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialIPv4 ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > IPv4_DEVICE_PATH *Ip; > CHAR16 Buffer[10]; > > @@ -913,19 +1013,26 @@ DevPathSerialIPv4 ( > (UINTN) Ip->LocalIpAddress.Addr[2], > (UINTN) Ip->LocalIpAddress.Addr[3] > ); > - AppendCSDStr (MappingItem, Buffer); > - AppendCSDNum (MappingItem, Ip->LocalPort); > - UnicodeSPrint ( > - Buffer, > - 0, > - L"%02x%02x%02x%02x", > - (UINTN) Ip->RemoteIpAddress.Addr[0], > - (UINTN) Ip->RemoteIpAddress.Addr[1], > - (UINTN) Ip->RemoteIpAddress.Addr[2], > - (UINTN) Ip->RemoteIpAddress.Addr[3] > - ); > - AppendCSDStr (MappingItem, Buffer); > - AppendCSDNum (MappingItem, Ip->RemotePort); > + Status = AppendCSDStr (MappingItem, Buffer); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Ip->LocalPort); > + } > + if (!EFI_ERROR (Status)) { > + UnicodeSPrint ( > + Buffer, > + 0, > + L"%02x%02x%02x%02x", > + (UINTN) Ip->RemoteIpAddress.Addr[0], > + (UINTN) Ip->RemoteIpAddress.Addr[1], > + (UINTN) Ip->RemoteIpAddress.Addr[2], > + (UINTN) Ip->RemoteIpAddress.Addr[3] > + ); > + Status = AppendCSDStr (MappingItem, Buffer); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Ip->RemotePort); > + } > + return Status; > } > > /** > @@ -935,15 +1042,17 @@ DevPathSerialIPv4 ( > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialIPv6 ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > IPv6_DEVICE_PATH *Ip; > UINTN Index; > CHAR16 Buffer[64]; > @@ -957,14 +1066,21 @@ DevPathSerialIPv6 ( > UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip- > >LocalIpAddress.Addr[Index]); > } > > - AppendCSDStr (MappingItem, Buffer); > - AppendCSDNum (MappingItem, Ip->LocalPort); > - for (Index = 0, PBuffer = Buffer; Index < 16; Index++, PBuffer += 2) { > - UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip- > >RemoteIpAddress.Addr[Index]); > + Status = AppendCSDStr (MappingItem, Buffer); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Ip->LocalPort); > } > + if (!EFI_ERROR (Status)) { > + for (Index = 0, PBuffer = Buffer; Index < 16; Index++, PBuffer += 2) { > + UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip- > >RemoteIpAddress.Addr[Index]); > + } > > - AppendCSDStr (MappingItem, Buffer); > - AppendCSDNum (MappingItem, Ip->RemotePort); > + Status = AppendCSDStr (MappingItem, Buffer); > + } > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Ip->RemotePort); > + } > + return Status; > } > > /** > @@ -974,23 +1090,28 @@ DevPathSerialIPv6 ( > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialScsi ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > SCSI_DEVICE_PATH *Scsi; > > ASSERT(DevicePathNode != NULL); > ASSERT(MappingItem != NULL); > > Scsi = (SCSI_DEVICE_PATH *) DevicePathNode; > - AppendCSDNum (MappingItem, Scsi->Pun); > - AppendCSDNum (MappingItem, Scsi->Lun); > + Status = AppendCSDNum (MappingItem, Scsi->Pun); > + if (!EFI_ERROR (Status)) { > + Status = AppendCSDNum (MappingItem, Scsi->Lun); > + } > + return Status; > } > > /** > @@ -999,9 +1120,11 @@ DevPathSerialScsi ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerial1394 ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -1016,7 +1139,7 @@ DevPathSerial1394 ( > > DevicePath_F1394 = (F1394_DEVICE_PATH *) DevicePathNode; > UnicodeSPrint (Buffer, 0, L"%lx", DevicePath_F1394->Guid); > - AppendCSDStr (MappingItem, Buffer); > + return AppendCSDStr (MappingItem, Buffer); > } > > /** > @@ -1025,9 +1148,11 @@ DevPathSerial1394 ( > @param[in] DevicePathNode The node to get info on. > @param[in] MappingItem The info item to populate. > @param[in] DevicePath Ignored. > + > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialAcpi ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > @@ -1043,9 +1168,10 @@ DevPathSerialAcpi ( > if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) { > if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) { > MappingItem->Mtd = MTDTypeFloppy; > - AppendCSDNum (MappingItem, Acpi->UID); > + return AppendCSDNum (MappingItem, Acpi->UID); > } > } > + return EFI_SUCCESS; > } > > /** > @@ -1055,17 +1181,17 @@ DevPathSerialAcpi ( > @param[in] MappingItem Ignored. > @param[in] DevicePath Ignored. > > - Does nothing. > + @retval EFI_OUT_OF_RESOURCES Out of resources. > + @retval EFI_SUCCESS The appending was successful. > **/ > -VOID > -EFIAPI > +EFI_STATUS > DevPathSerialDefault ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, > IN DEVICE_CONSIST_MAPPING_INFO *MappingItem, > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > - return; > + return EFI_SUCCESS; > } > > DEV_PATH_CONSIST_MAPPING_TABLE DevPathConsistMappingTable[] = { > @@ -1304,6 +1430,7 @@ GetDeviceConsistMappingInfo ( > IN EFI_DEVICE_PATH_PROTOCOL *DevicePath > ) > { > + EFI_STATUS Status; > SERIAL_DECODE_FUNCTION SerialFun; > UINTN Index; > EFI_DEVICE_PATH_PROTOCOL *OriginalDevicePath; > @@ -1329,7 +1456,11 @@ GetDeviceConsistMappingInfo ( > } > } > > - SerialFun (DevicePath, MappingItem, OriginalDevicePath); > + Status = SerialFun (DevicePath, MappingItem, OriginalDevicePath); > + if (EFI_ERROR (Status)) { > + SHELL_FREE_NON_NULL (MappingItem->Csd.Str); > + return Status; > + } > > // > // Next device path node > @@ -1476,11 +1607,12 @@ > ShellCommandConsistMappingGenMappingName ( > IN EFI_DEVICE_PATH_PROTOCOL **Table > ) > { > + EFI_STATUS Status; > POOL_PRINT Str; > DEVICE_CONSIST_MAPPING_INFO MappingInfo; > EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; > UINTN Index; > - UINTN NewSize; > + CHAR16 *NewStr; > > ASSERT(DevicePath != NULL); > ASSERT(Table != NULL); > @@ -1505,7 +1637,10 @@ ShellCommandConsistMappingGenMappingName > ( > MappingInfo.Mtd = MTDTypeUnknown; > MappingInfo.Digital = FALSE; > > - GetDeviceConsistMappingInfo (&MappingInfo, DevicePath); > + Status = GetDeviceConsistMappingInfo (&MappingInfo, DevicePath); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > > SetMem (&Str, sizeof (Str), 0); > for (Index = 0; mMTDName[Index].MTDType != MTDTypeEnd; Index++) { > @@ -1515,26 +1650,32 @@ > ShellCommandConsistMappingGenMappingName ( > } > > if (mMTDName[Index].MTDType != MTDTypeEnd) { > - CatPrint (&Str, L"%s", mMTDName[Index].Name); > + Status = CatPrint (&Str, L"%s", mMTDName[Index].Name); > } > > - CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi); > - if (MappingInfo.Csd.Str != NULL) { > - CatPrint (&Str, L"%s", MappingInfo.Csd.Str); > + if (!EFI_ERROR (Status)) { > + Status = CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi); > + } > + if (!EFI_ERROR (Status) && MappingInfo.Csd.Str != NULL) { > + Status = CatPrint (&Str, L"%s", MappingInfo.Csd.Str); > FreePool (MappingInfo.Csd.Str); > } > > - if (Str.Str != NULL) { > - CatPrint (&Str, L":"); > + if (!EFI_ERROR (Status) && Str.Str != NULL) { > + Status = CatPrint (&Str, L":"); > + } > + if (EFI_ERROR (Status)) { > + SHELL_FREE_NON_NULL (Str.Str); > + return NULL; > } > > - NewSize = (Str.Len + 1) * sizeof (CHAR16); > - Str.Str = ReallocatePool (Str.Len, NewSize, Str.Str); > - if (Str.Str == NULL) { > + NewStr = ReallocatePool (Str.Len * sizeof (CHAR16), (Str.Len + 1) * sizeof > (CHAR16), Str.Str); > + if (NewStr == NULL) { > + SHELL_FREE_NON_NULL (Str.Str); > return (NULL); > } > - Str.Str[Str.Len] = CHAR_NULL; > - return Str.Str; > + NewStr[Str.Len] = CHAR_NULL; > + return NewStr; > } > > /** > -- > 2.9.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel