]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrForm.c
Update Performance library instances to adapt to the update in Performance infrastruc...
[mirror_edk2.git] / MdeModulePkg / Library / UefiIfrSupportLib / UefiIfrForm.c
index fb023c39949984f5ce43c4a6b4e7888a8f76d7fd..9e6d3382f70682e6fa80e684e70ba650c91069fb 100644 (file)
@@ -342,10 +342,10 @@ ExtractBlockName (
   //                 |   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
@@ -522,6 +522,13 @@ ConstructConfigAltResp (
   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
@@ -535,39 +542,47 @@ ConstructConfigAltResp (
              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
@@ -587,36 +602,48 @@ ConstructConfigAltResp (
     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
@@ -625,7 +652,7 @@ ConstructConfigAltResp (
   TempStr = AllocateZeroPool (StrBufferLen);\r
   *ConfigAltResp = TempStr;\r
   if (TempStr == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    goto Exit;\r
   }\r
 \r
   //\r
@@ -641,13 +668,23 @@ ConstructConfigAltResp (
     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
@@ -936,6 +973,11 @@ ConstructConfigHdr (
   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
@@ -967,7 +1009,7 @@ ConstructConfigHdr (
   // | 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
@@ -1213,7 +1255,7 @@ GetBrowserData (
   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
@@ -1229,9 +1271,7 @@ GetBrowserData (
                            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
@@ -1527,6 +1567,8 @@ BufToHexString (
   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
@@ -1557,6 +1599,10 @@ HexStringToBuf (
   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