CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mIfrSupportLibHiiConfigRouting = NULL;\r
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mIfrSupportLibHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
\r
+//\r
+// Fake <ConfigHdr>\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";\r
+\r
/**\r
This function locate FormBrowser2 protocols for later usage.\r
\r
return EFI_SUCCESS;\r
}\r
\r
-//\r
-// Fake <ConfigHdr>\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";\r
-\r
/**\r
Draw a dialog and return the selected key.\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
StrCat (TempStr, DescHdr + Index * 16);\r
StrCat (TempStr, AltCfg[Index]);\r
\r
- gBS->FreePool (AltCfg[Index]);\r
+ FreePool (AltCfg[Index]);\r
}\r
\r
+Exit:\r
if (NeedFreeConfigRequest) {\r
- gBS->FreePool (ConfigRequest);\r
+ FreePool (ConfigRequest);\r
+ }\r
+ FreePool (ConfigHdr);\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
- gBS->FreePool (ConfigHdr);\r
- gBS->FreePool (ConfigResp);\r
- gBS->FreePool (DescHdr);\r
- gBS->FreePool (AltCfg);\r
\r
return EFI_SUCCESS;\r
}\r
CHAR16 *StrPtr;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
+ //\r
+ // Make sure when ConfigHdr is NULL, StrBufferlen must be 0\r
+ //\r
+ ASSERT (!(ConfigHdr == NULL && *StrBufferLen != 0));\r
+\r
if (Name == NULL) {\r
//\r
// There will be no "NAME" in <ConfigHdr> for Name/Value storage\r
// | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 |\r
//\r
BufferSize = (5 + 32 + 6 + NameStrLen * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16);\r
- if (*StrBufferLen < BufferSize) {\r
+ if ((*StrBufferLen == 0) || *StrBufferLen < BufferSize) {\r
*StrBufferLen = BufferSize;\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
if (EFI_ERROR (Status) || (StrCmp (Name, StorageName) != 0)) {\r
Match = FALSE;\r
}\r
- gBS->FreePool (Name);\r
+ FreePool (Name);\r
}\r
\r
return Match;\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
If String has N valid hexadecimal characters for conversion, the caller must make sure Buffer is at least \r
N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. \r
\r
+ If either Buffer, BufferSizeInBytes or String is NULL, then ASSERT ().\r
+\r
@param Buffer The output buffer allocated by the caller.\r
@param BufferSizeInBytes On input, the size in bytes of Buffer. On output, it is updated to \r
contain the size of the Buffer which is actually used for the converstion.\r
UINT8 Digit;\r
UINT8 Byte;\r
\r
+ ASSERT (Buffer != NULL);\r
+ ASSERT (BufferSizeInBytes != NULL);\r
+ ASSERT (String != NULL);\r
+\r
//\r
// Find out how many hex characters the string has.\r
//\r