]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/HiiDatabase: Fix Setup numeric default value incorrect issue
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / ConfigRouting.c
index 2f792d296530a2a3b4f5739dd60c8c51329bc6d0..5ae6189a2843ce6fa386cc05a0717c71433f2191 100644 (file)
@@ -2171,6 +2171,7 @@ ParseIfrData (
   UINTN                        PackageOffset;\r
   EFI_IFR_VARSTORE             *IfrVarStore;\r
   EFI_IFR_VARSTORE_EFI         *IfrEfiVarStore;\r
+  EFI_IFR_VARSTORE_EFI         *IfrEfiVarStoreTmp;\r
   EFI_IFR_OP_HEADER            *IfrOpHdr;\r
   EFI_IFR_ONE_OF               *IfrOneOf;\r
   EFI_IFR_REF4                 *IfrRef;\r
@@ -2187,6 +2188,7 @@ ParseIfrData (
   IFR_BLOCK_DATA               *BlockData;\r
   CHAR16                       *VarStoreName;\r
   UINTN                        NameSize;\r
+  UINTN                        NvDefaultStoreSize;\r
   UINT16                       VarWidth;\r
   UINT16                       VarDefaultId;\r
   BOOLEAN                      FirstOneOfOption;\r
@@ -2212,6 +2214,7 @@ ParseIfrData (
   SmallestDefaultId      = 0xFFFF;\r
   FromOtherDefaultOpcode = FALSE;\r
   QuestionReferBitField  = FALSE;\r
+  IfrEfiVarStoreTmp      = NULL;\r
 \r
   //\r
   // Go through the form package to parse OpCode one by one.\r
@@ -2303,6 +2306,18 @@ ParseIfrData (
         }\r
 \r
         AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);\r
+        if (IfrEfiVarStoreTmp != NULL) {\r
+          FreePool (IfrEfiVarStoreTmp);\r
+        }\r
+\r
+        IfrEfiVarStoreTmp = AllocatePool (IfrEfiVarStore->Header.Length + AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name));\r
+        if (IfrEfiVarStoreTmp == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          goto Done;\r
+        }\r
+\r
+        CopyMem (IfrEfiVarStoreTmp, IfrEfiVarStore, IfrEfiVarStore->Header.Length);\r
+        AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, (CHAR16 *)&(IfrEfiVarStoreTmp->Name[0]), AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
 \r
         if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {\r
           //\r
@@ -2502,9 +2517,14 @@ ParseIfrData (
           //\r
           // Set default value base on the DefaultId list get from IFR data.\r
           //\r
+          NvDefaultStoreSize = PcdGetSize (PcdNvStoreDefaultValueBuffer);\r
           for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {\r
             DefaultDataPtr        = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);\r
             DefaultData.DefaultId = DefaultDataPtr->DefaultId;\r
+            if (NvDefaultStoreSize > sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)) {\r
+              FindQuestionDefaultSetting (DefaultData.DefaultId, IfrEfiVarStoreTmp, &(IfrOneOf->Question), &DefaultData.Value, VarWidth, QuestionReferBitField);\r
+            }\r
+\r
             InsertDefaultValue (BlockData, &DefaultData);\r
           }\r
         }\r
@@ -3192,6 +3212,10 @@ Done:
     }\r
   }\r
 \r
+  if (IfrEfiVarStoreTmp != NULL) {\r
+    FreePool (IfrEfiVarStoreTmp);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r