// | 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
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
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