BufferSize = 0;\r
HiiPackageList = NULL;\r
Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
+ //\r
+ // Handle is a invalid handle. Check if Handle is corrupted.\r
+ //\r
+ ASSERT (Status != EFI_NOT_FOUND);\r
+ //\r
+ // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+ //\r
+ ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+ HiiPackageList = AllocatePool (BufferSize);\r
+ ASSERT (HiiPackageList != NULL);\r
\r
- Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (HiiPackageList);\r
- return Status;\r
- }\r
+ Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (HiiPackageList);\r
+ return Status;\r
}\r
\r
//\r
OUT EFI_HII_HANDLE **HiiHandleBuffer\r
)\r
{\r
- UINTN BufferLength;\r
EFI_STATUS Status;\r
\r
ASSERT (HandleBufferLength != NULL);\r
ASSERT (HiiHandleBuffer != NULL);\r
\r
- BufferLength = 0;\r
+ *HandleBufferLength = 0;\r
+ *HiiHandleBuffer = NULL;\r
\r
//\r
// Try to find the actual buffer size for HiiHandle Buffer.\r
mHiiDatabaseProt,\r
EFI_HII_PACKAGE_TYPE_ALL,\r
NULL,\r
- &BufferLength,\r
+ HandleBufferLength,\r
*HiiHandleBuffer\r
);\r
-\r
+ \r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
- *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
+ *HiiHandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
ASSERT (*HiiHandleBuffer != NULL);\r
Status = mHiiDatabaseProt->ListPackageLists (\r
mHiiDatabaseProt,\r
EFI_HII_PACKAGE_TYPE_ALL,\r
NULL,\r
- &BufferLength,\r
+ HandleBufferLength,\r
*HiiHandleBuffer\r
);\r
- //\r
- // we should not fail here.\r
- //\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
\r
- *HandleBufferLength = BufferLength;\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (*HiiHandleBuffer);\r
+ *HiiHandleBuffer = NULL;\r
+ }\r
+ }\r
\r
return Status;\r
}\r
// | 8 | 4 | 7 | 4 |\r
//\r
StringPtr = AllocateZeroPool ((BlockNameNumber * (8 + 4 + 7 + 4) + 1) * sizeof (CHAR16));\r
- *BlockName = StringPtr;\r
if (StringPtr == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+ *BlockName = StringPtr;\r
\r
Buffer += sizeof (UINT32);\r
for (Index = 0; Index < BlockNameNumber; Index++) {\r
if (ConfigAltResp == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+ \r
+ DescHdr = NULL;\r
+ StringPtr = NULL;\r
+ AltCfg = NULL;\r
+ ConfigResp = NULL;\r
+ BlockName = NULL;\r
+ NeedFreeConfigRequest = FALSE;\r
\r
//\r
// Construct <ConfigHdr> : "GUID=...&NAME=...&PATH=..."\r
Name,\r
DriverHandle\r
);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- ConfigHdr = AllocateZeroPool (StrBufferLen);\r
- Status = ConstructConfigHdr (\r
- ConfigHdr,\r
- &StrBufferLen,\r
- Guid,\r
- Name,\r
- DriverHandle\r
- );\r
+ ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+ ConfigHdr = AllocateZeroPool (StrBufferLen);\r
+ if (ConfigHdr == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
}\r
+ Status = ConstructConfigHdr (\r
+ ConfigHdr,\r
+ &StrBufferLen,\r
+ Guid,\r
+ Name,\r
+ DriverHandle\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Exit;\r
}\r
\r
//\r
// Construct <ConfigResp>\r
//\r
- NeedFreeConfigRequest = FALSE;\r
if (ConfigRequest == NULL) {\r
//\r
// If ConfigRequest is set to NULL, export all configurable elements in BlockNameArray\r
//\r
Status = ExtractBlockName (BlockNameArray, &BlockName);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Exit;\r
}\r
\r
Len = StrSize (ConfigHdr);\r
ConfigRequest = AllocateZeroPool (Len + StrSize (BlockName) - sizeof (CHAR16));\r
+ if (ConfigRequest == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+ \r
StrCpy (ConfigRequest, ConfigHdr);\r
StrCat (ConfigRequest, BlockName);\r
NeedFreeConfigRequest = TRUE;\r
+\r
}\r
\r
Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
return Status;\r
}\r
\r
+ AltRespLen = 0;\r
//\r
// Construct <AltResp>\r
//\r
- DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
- StringPtr = DescHdr;\r
- AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
- AltRespLen = 0;\r
- VA_START (Args, NumberAltCfg);\r
- for (Index = 0; Index < NumberAltCfg; Index++) {\r
- AltCfgId = (UINT16) VA_ARG (Args, UINT16);\r
- DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *);\r
-\r
- //\r
- // '&' <ConfigHdr>\r
- //\r
- AltRespLen += (StrLen (ConfigHdr) + 1);\r
-\r
- StringPtr = DescHdr + Index * 16;\r
- StrCpy (StringPtr, L"&ALTCFG=");\r
- AltRespLen += (8 + sizeof (UINT16) * 2);\r
+ if (NumberAltCfg > 0) {\r
+ DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
+ if (DescHdr == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+ \r
+ StringPtr = DescHdr;\r
+ AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
+ if (AltCfg == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
\r
- StrBufferLen = 5;\r
- BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16));\r
- Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ VA_START (Args, NumberAltCfg);\r
+ for (Index = 0; Index < NumberAltCfg; Index++) {\r
+ AltCfgId = (UINT16) VA_ARG (Args, UINT16);\r
+ DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *);\r
+ \r
+ //\r
+ // '&' <ConfigHdr>\r
+ //\r
+ AltRespLen += (StrLen (ConfigHdr) + 1);\r
+ \r
+ StringPtr = DescHdr + Index * 16;\r
+ StrCpy (StringPtr, L"&ALTCFG=");\r
+ AltRespLen += (8 + sizeof (UINT16) * 2);\r
+ \r
+ StrBufferLen = 5;\r
+ BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16));\r
+ Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Exit;\r
+ }\r
+ AltRespLen += StrLen (AltCfg[Index]);\r
}\r
- AltRespLen += StrLen (AltCfg[Index]);\r
+ VA_END (Args);\r
}\r
- VA_END (Args);\r
\r
//\r
// Generate the final <ConfigAltResp>\r
TempStr = AllocateZeroPool (StrBufferLen);\r
*ConfigAltResp = TempStr;\r
if (TempStr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
}\r
\r
//\r
FreePool (AltCfg[Index]);\r
}\r
\r
+Exit:\r
if (NeedFreeConfigRequest) {\r
FreePool (ConfigRequest);\r
}\r
FreePool (ConfigHdr);\r
- FreePool (ConfigResp);\r
- FreePool (DescHdr);\r
- FreePool (AltCfg);\r
+ if (ConfigResp != NULL) {\r
+ FreePool (ConfigResp);\r
+ }\r
+\r
+ if (BlockName != NULL) {\r
+ FreePool (BlockName);\r
+ }\r
+\r
+ if (NumberAltCfg > 0) {\r
+ FreePool (DescHdr);\r
+ FreePool (AltCfg);\r
+ }\r
\r
return EFI_SUCCESS;\r
}\r
BufferLen = 0x4000;\r
ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
if (ConfigResp == NULL) {\r
- BufferLen = 0;\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
StringPtr = ConfigResp + HeaderLen;\r
VariableName\r
);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
- if (ConfigResp != NULL) {\r
- FreePool (ConfigResp);\r
- }\r
+ FreePool (ConfigResp);\r
\r
ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
if (ConfigResp == NULL) {\r