]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
Fix K8 issues in HiiDataBase
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / ConfigRouting.c
index 2f5118e51268b58c661aa1454045429c9ad39027..665b951869d1a15e110c63a56da67df5a0fd8aba 100644 (file)
@@ -577,6 +577,10 @@ MergeDefaultString (
                                      SizeAltCfgResp + StrSize (StringPtrDefault),\r
                                      (VOID *) (*AltCfgResp)\r
                                      );\r
+        if (*AltCfgResp == NULL) {\r
+          FreePool (AltConfigHdr);\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
         StrCat (*AltCfgResp, StringPtrDefault);\r
         break;\r
       } else {\r
@@ -594,11 +598,12 @@ MergeDefaultString (
     \r
     //\r
     // Find next AltCfg String\r
-    //    \r
+    //\r
     *(AltConfigHdr + HeaderLength) = L'\0';\r
     StringPtrDefault = StrStr (StringPtrDefault + 1, AltConfigHdr);    \r
   }\r
-\r
+  \r
+  FreePool (AltConfigHdr);\r
   return EFI_SUCCESS;  \r
 }\r
 \r
@@ -796,7 +801,7 @@ ParseIfrData (
   IN     EFI_STRING          ConfigHdr,\r
   IN     IFR_BLOCK_DATA      *RequestBlockArray,\r
   IN OUT IFR_VARSTORAGE_DATA *VarStorageData,\r
-  OUT    IFR_DEFAULT_DATA    **PIfrDefaultIdArray\r
+  OUT    IFR_DEFAULT_DATA    *DefaultIdArray\r
   )\r
 {\r
   EFI_STATUS               Status;\r
@@ -810,7 +815,6 @@ ParseIfrData (
   EFI_IFR_CHECKBOX         *IfrCheckBox;\r
   EFI_IFR_PASSWORD         *IfrPassword;\r
   EFI_IFR_STRING           *IfrString;\r
-  IFR_DEFAULT_DATA         *DefaultIdArray;\r
   IFR_DEFAULT_DATA         *DefaultData;\r
   IFR_BLOCK_DATA           *BlockData;\r
   CHAR16                   *VarStoreName;\r
@@ -823,9 +827,6 @@ ParseIfrData (
   EFI_STRING               TempStr;\r
   UINTN                    LengthString;\r
 \r
-  //\r
-  // Initialize DefaultIdArray to store the map between DeaultId and DefaultName\r
-  //\r
   LengthString     = 0;\r
   Status           = EFI_SUCCESS;\r
   GuidStr          = NULL;\r
@@ -833,11 +834,6 @@ ParseIfrData (
   TempStr          = NULL;\r
   BlockData        = NULL;\r
   DefaultData      = NULL;\r
-  DefaultIdArray   = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
-  if (DefaultIdArray == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  InitializeListHead (&DefaultIdArray->Entry);\r
 \r
   //\r
   // Go through the form package to parse OpCode one by one.\r
@@ -935,6 +931,13 @@ ParseIfrData (
       // Numeric and OneOf has the same opcode structure.\r
       //\r
 \r
+      //\r
+      // Numeric and OneOf question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
       //\r
       // Check whether this question is for the requested varstore.\r
       //\r
@@ -992,7 +995,14 @@ ParseIfrData (
       // width by EFI_IFR_ORDERED_LIST MaxContainers * OneofOption Type\r
       // no default value and default id, how to define its default value?\r
       //\r
-      \r
+\r
+      //\r
+      // OrderedList question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
       //\r
       // Check whether this question is for the requested varstore.\r
       //\r
@@ -1056,6 +1066,13 @@ ParseIfrData (
       // default id by DeaultOption DefaultId can override CheckBox Flags and Default value.\r
       // \r
 \r
+      //\r
+      // CheckBox question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
       //\r
       // Check whether this question is for the requested varstore.\r
       //\r
@@ -1170,6 +1187,13 @@ ParseIfrData (
       // no default value, only block array\r
       //\r
 \r
+      //\r
+      // String question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
       //\r
       // Check whether this question is for the requested varstore.\r
       //\r
@@ -1234,6 +1258,13 @@ ParseIfrData (
       // no default value, only block array\r
       //\r
 \r
+      //\r
+      // Password question is not in IFR Form. This IFR form is not valid. \r
+      //\r
+      if (VarStorageData->Size == 0) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+        goto Done;\r
+      }\r
       //\r
       // Check whether this question is for the requested varstore.\r
       //\r
@@ -1424,7 +1455,7 @@ ParseIfrData (
       break;\r
     case EFI_IFR_END_OP:\r
       //\r
-      // End Opcode is for Var.\r
+      // End Opcode is for Var question.\r
       //\r
       if (BlockData != NULL && BlockData->Scope > 0) {\r
         BlockData->Scope--;\r
@@ -1441,11 +1472,6 @@ ParseIfrData (
   }\r
 \r
 Done:\r
-  //\r
-  // Set the defualt ID array.\r
-  //\r
-  *PIfrDefaultIdArray = DefaultIdArray;\r
-\r
   return Status;  \r
 }\r
 \r
@@ -1456,7 +1482,7 @@ Done:
   When Request points to NULL string, the request string and default value string \r
   for each varstore in form package will return. \r
 \r
-  @param  HiiHandle              Hii Handle which Hii Packages are registered.\r
+  @param  DataBaseRecord         The DataBaseRecord instance contains the found Hii handle and package.\r
   @param  DevicePath             Device Path which Hii Config Access Protocol is registered.\r
   @param  Request                Pointer to a null-terminated Unicode string in\r
                                  <ConfigRequest> format. When it doesn't contain\r
@@ -1486,24 +1512,22 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 GetFullStringFromHiiFormPackages (\r
-  IN     EFI_HII_HANDLE             HiiHandle,\r
+  IN     HII_DATABASE_RECORD        *DataBaseRecord,\r
   IN     EFI_DEVICE_PATH_PROTOCOL   *DevicePath,\r
   IN OUT EFI_STRING                 *Request,\r
   IN OUT EFI_STRING                 *AltCfgResp\r
   )\r
 {\r
   EFI_STATUS                   Status;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINT32                       PackageListLength;  \r
-  UINTN                        BufferSize;\r
+  UINT8                        *HiiFormPackage;\r
+  UINTN                        PackageSize;\r
+  UINTN                        ResultSize;\r
   IFR_BLOCK_DATA               *RequestBlockArray;\r
   IFR_BLOCK_DATA               *BlockData;\r
   IFR_BLOCK_DATA               *NextBlockData;\r
   IFR_DEFAULT_DATA             *DefaultValueData;\r
   IFR_DEFAULT_DATA             *DefaultId;\r
   IFR_DEFAULT_DATA             *DefaultIdArray;\r
-  EFI_HII_PACKAGE_HEADER       PacakgeHeader;\r
-  UINT32                       PackageOffset;\r
   IFR_VARSTORAGE_DATA          *VarStorageData;\r
   EFI_STRING                   DefaultAltCfgResp;\r
   EFI_STRING                   FullConfigRequest;\r
@@ -1524,63 +1548,60 @@ GetFullStringFromHiiFormPackages (
   // Initialize the local variables.\r
   //\r
   RequestBlockArray = NULL;\r
+  DefaultIdArray    = NULL;\r
   VarStorageData    = NULL;\r
   DefaultAltCfgResp = NULL;\r
   FullConfigRequest = NULL;\r
   ConfigHdr         = NULL;\r
-  DefaultIdArray    = NULL;\r
   GuidStr           = NULL;\r
   NameStr           = NULL;\r
   PathStr           = NULL;\r
-\r
-  //\r
-  // 1. Get HiiPackage by HiiHandle\r
-  //\r
-  BufferSize      = 0;\r
-  HiiPackageList  = NULL;\r
-  Status = HiiExportPackageLists (&mPrivate.HiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
-\r
-  //\r
-  // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+  HiiFormPackage    = NULL;\r
+  ResultSize        = 0;\r
+  PackageSize       = 0;\r
+  \r
   //\r
-  if (Status != EFI_BUFFER_TOO_SMALL) {\r
+  // 0. Get Hii Form Package by HiiHandle\r
+  //\r
+  Status = ExportFormPackages (\r
+             &mPrivate, \r
+             DataBaseRecord->Handle, \r
+             DataBaseRecord->PackageList, \r
+             0, \r
+             PackageSize, \r
+             HiiFormPackage,\r
+             &ResultSize\r
+           );\r
+  if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
-\r
-  HiiPackageList = AllocatePool (BufferSize);\r
-  if (HiiPackageList == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
\r
+  HiiFormPackage = AllocatePool (ResultSize);\r
+  if (HiiFormPackage == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
   }\r
 \r
   //\r
-  // Get PackageList on HiiHandle\r
+  // Get HiiFormPackage by HiiHandle\r
   //\r
-  Status = HiiExportPackageLists (&mPrivate.HiiDatabase, HiiHandle, &BufferSize, HiiPackageList);\r
+  PackageSize   = ResultSize;\r
+  ResultSize    = 0;\r
+  Status = ExportFormPackages (\r
+             &mPrivate, \r
+             DataBaseRecord->Handle, \r
+             DataBaseRecord->PackageList, \r
+             0,\r
+             PackageSize, \r
+             HiiFormPackage,\r
+             &ResultSize\r
+           );\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
   //\r
-  // 2. Parse FormPackage to get BlockArray and DefaultId Array for the request BlockArray.\r
-  //    1) Request is NULL.\r
-  //    2) Request is not NULL. And it doesn't contain any BlockArray.\r
-  //    3) Request is not NULL. And it containts BlockArray.\r
-  //\r
-\r
-  //\r
-  // Initialize VarStorageData to store the var store Block and Default value information.\r
-  //\r
-  VarStorageData = (IFR_VARSTORAGE_DATA *) AllocateZeroPool (sizeof (IFR_VARSTORAGE_DATA));\r
-  if (VarStorageData == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-\r
-  InitializeListHead (&VarStorageData->Entry);\r
-  InitializeListHead (&VarStorageData->BlockEntry);\r
-\r
-  //\r
-  // Gte the request block array by Request String \r
+  // 1. Get the request block array by Request String when Request string containts the block array.\r
   //\r
   StringPtr = NULL;\r
   if (*Request != NULL) {\r
@@ -1695,39 +1716,36 @@ GetFullStringFromHiiFormPackages (
   }\r
   \r
   //\r
-  // Get the form package\r
+  // 2. Parse FormPackage to get BlockArray and DefaultId Array for the request BlockArray.\r
   //\r
-  PackageOffset     = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-  PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
-  while (PackageOffset < PackageListLength) {\r
-    CopyMem (&PacakgeHeader, (UINT8 *) HiiPackageList + PackageOffset, sizeof (PacakgeHeader));\r
-\r
-    if (PacakgeHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
-      //\r
-      // Reset VarStorageData\r
-      //\r
-      VarStorageData->Size = 0;\r
-      VarStorageData->VarStoreId = 0;\r
-      if (VarStorageData->Name != NULL) {\r
-        FreePool (VarStorageData->Name);\r
-        VarStorageData->Name = NULL;\r
-      }\r
 \r
-      //\r
-      // Parse the opcode in form package \r
-      //\r
-      Status = ParseIfrData ((UINT8 *) HiiPackageList + PackageOffset, PacakgeHeader.Length, *Request, RequestBlockArray, VarStorageData, &DefaultIdArray);\r
-      if (EFI_ERROR (Status)) {\r
-        goto Done;\r
-      }\r
+  //\r
+  // Initialize DefaultIdArray to store the map between DeaultId and DefaultName\r
+  //\r
+  DefaultIdArray   = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
+  if (DefaultIdArray == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+  InitializeListHead (&DefaultIdArray->Entry);\r
 \r
-      //\r
-      // Only one form is in a pacakge list.\r
-      //\r
-      break;\r
-    }\r
+  //\r
+  // Initialize VarStorageData to store the var store Block and Default value information.\r
+  //\r
+  VarStorageData = (IFR_VARSTORAGE_DATA *) AllocateZeroPool (sizeof (IFR_VARSTORAGE_DATA));\r
+  if (VarStorageData == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+  InitializeListHead (&VarStorageData->Entry);\r
+  InitializeListHead (&VarStorageData->BlockEntry);\r
 \r
-    PackageOffset += PacakgeHeader.Length;\r
+  //\r
+  // Parse the opcode in form pacakge to get the default setting.\r
+  //\r
+  Status = ParseIfrData (HiiFormPackage, (UINT32) PackageSize, *Request, RequestBlockArray, VarStorageData, DefaultIdArray);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
   }\r
   \r
   //\r
@@ -2011,8 +2029,8 @@ Done:
   //\r
   // Free Pacakge data\r
   //\r
-  if (HiiPackageList != NULL) {\r
-    FreePool (HiiPackageList);\r
+  if (HiiFormPackage != NULL) {\r
+    FreePool (HiiFormPackage);\r
   }\r
 \r
   return Status;\r
@@ -2158,6 +2176,7 @@ HiiConfigRoutingExtractConfig (
     //\r
     DriverHandle     = NULL;\r
     HiiHandle        = NULL;\r
+    Database         = NULL;\r
     DevicePathLength = GetDevicePathSize (DevicePath);\r
     for (Link = Private->DatabaseList.ForwardLink;\r
          Link != &Private->DatabaseList;\r
@@ -2208,7 +2227,7 @@ HiiConfigRoutingExtractConfig (
       //\r
       // Get the full request string from IFR when HiiPackage is registered to HiiHandle \r
       //\r
-      Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &DefaultResults);\r
+      Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults);\r
       if (EFI_ERROR (Status)) {\r
         goto Done;\r
       }\r
@@ -2257,7 +2276,7 @@ HiiConfigRoutingExtractConfig (
     //\r
     if (HiiHandle != NULL) {\r
       if (DefaultResults == NULL) {\r
-        Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &AccessResults);\r
+        Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &AccessResults);\r
       } else {\r
         Status = MergeDefaultString (&AccessResults, DefaultResults);\r
       }\r
@@ -2425,6 +2444,7 @@ HiiConfigRoutingExportConfig (
     HiiHandle        = NULL;\r
     ConfigRequest    = NULL;\r
     DefaultResults   = NULL;\r
+    Database         = NULL;\r
     DevicePath       = DevicePathFromHandle (ConfigAccessHandles[Index]);\r
     DevicePathLength = GetDevicePathSize (DevicePath);\r
     if (DevicePath != NULL) {\r
@@ -2452,7 +2472,7 @@ HiiConfigRoutingExportConfig (
     // Update AccessResults by getting default setting from IFR when HiiPackage is registered to HiiHandle \r
     //\r
     if (HiiHandle != NULL && DevicePath != NULL) {\r
-      Status = GetFullStringFromHiiFormPackages (HiiHandle, DevicePath, &ConfigRequest, &DefaultResults);\r
+      Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults);\r
     }\r
     //\r
     // Can't parse IFR data to get the request string and default string.\r
@@ -2473,8 +2493,10 @@ HiiConfigRoutingExportConfig (
       // Merge the default sting from IFR code into the got setting from driver.\r
       //\r
       if (DefaultResults != NULL) {\r
-        MergeDefaultString (&AccessResults, DefaultResults);\r
+        Status = MergeDefaultString (&AccessResults, DefaultResults);\r
+        ASSERT_EFI_ERROR (Status);\r
         FreePool (DefaultResults);\r
+        DefaultResults = NULL;\r
       }\r
       \r
       //\r