]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiIfrSupportLib/UefiIfrForm.c
Retire framework IfrSupportLib and HiiLib, which will be replaced by new designed...
[mirror_edk2.git] / MdeModulePkg / Library / UefiIfrSupportLib / UefiIfrForm.c
index fb023c39949984f5ce43c4a6b4e7888a8f76d7fd..8f83c6c4f24591f48d2076011c43b179c68b7e81 100644 (file)
@@ -2,7 +2,7 @@
 Utility functions which helps in opcode creation, HII configuration string manipulations, \r
 pop up window creations, setup browser persistence data set and get.\r
 \r
-Copyright (c) 2007- 2008, Intel Corporation\r
+Copyright (c) 2007- 2009, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -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
@@ -1011,6 +1053,7 @@ ConstructConfigHdr (
 \r
 **/\r
 BOOLEAN\r
+EFIAPI\r
 IsConfigHdrMatch (\r
   IN EFI_STRING                ConfigString,\r
   IN EFI_GUID                  *StorageGuid, OPTIONAL\r
@@ -1213,7 +1256,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 +1272,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 +1568,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 +1600,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