]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiHiiLib/HiiLib.c
Update HiiLib to copy all IfrOpcode, not Opcode by Opcode.
[mirror_edk2.git] / MdeModulePkg / Library / UefiHiiLib / HiiLib.c
index e1d8a64730fc789f1241ac0cd9a7ece777ac6ab6..d36828a1158ebd90fd0ca4081df211fd7e4d7ffc 100644 (file)
@@ -2191,8 +2191,7 @@ InternalHiiUpdateFormPackageData (
   BOOLEAN                   GetFormSet;\r
   BOOLEAN                   GetForm;\r
   BOOLEAN                   Updated;\r
-  EFI_IFR_OP_HEADER         *AddOpCode;\r
-  UINT32                    UpdatePackageLength;\r
+  UINTN                     UpdatePackageLength;\r
 \r
   CopyMem (TempPackage, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
   UpdatePackageLength = sizeof (EFI_HII_PACKAGE_HEADER);\r
@@ -2230,7 +2229,7 @@ InternalHiiUpdateFormPackageData (
     //\r
     // The matched Form is found, and Update data in this form\r
     //\r
-    if (GetFormSet && GetForm && !Updated) {\r
+    if (GetFormSet && GetForm) {\r
       UpdateIfrOpHdr = (EFI_IFR_OP_HEADER *) OpCodeBufferStart->Buffer;\r
       if ((UpdateIfrOpHdr->Length == IfrOpHdr->Length) && \\r
           (CompareMem (IfrOpHdr, UpdateIfrOpHdr, UpdateIfrOpHdr->Length) == 0)) {\r
@@ -2263,22 +2262,14 @@ InternalHiiUpdateFormPackageData (
             return EFI_NOT_FOUND;\r
           }\r
         }\r
+\r
         //\r
         // Insert the updated data\r
         //\r
-        UpdateIfrOpHdr = (EFI_IFR_OP_HEADER *) OpCodeBufferStart->Buffer;\r
-        AddSize        = UpdateIfrOpHdr->Length;\r
-        AddOpCode      = (EFI_IFR_OP_HEADER *) (OpCodeBufferStart->Buffer + AddSize);\r
-        while (AddSize < OpCodeBufferStart->Position) {\r
-          CopyMem (BufferPos, AddOpCode, AddOpCode->Length);\r
-          BufferPos           += AddOpCode->Length;\r
-          UpdatePackageLength += AddOpCode->Length;\r
-          \r
-          AddSize   += AddOpCode->Length;\r
-          AddOpCode  = (EFI_IFR_OP_HEADER *) (OpCodeBufferStart->Buffer + AddSize);\r
-        }\r
-\r
-        ASSERT (AddSize == OpCodeBufferStart->Position);\r
+        AddSize = ((EFI_IFR_OP_HEADER *) OpCodeBufferStart->Buffer)->Length;\r
+        CopyMem (BufferPos, OpCodeBufferStart->Buffer + AddSize, OpCodeBufferStart->Position - AddSize);\r
+        BufferPos           += OpCodeBufferStart->Position - AddSize;\r
+        UpdatePackageLength += OpCodeBufferStart->Position - AddSize;\r
 \r
         if (OpCodeBufferEnd != NULL) {\r
           //\r
@@ -2288,10 +2279,19 @@ InternalHiiUpdateFormPackageData (
           BufferPos           += IfrOpHdr->Length;\r
           UpdatePackageLength += IfrOpHdr->Length;\r
         }\r
+\r
+        //\r
+        // Copy the left package data.\r
+        //\r
+        Offset += IfrOpHdr->Length;\r
+        CopyMem (BufferPos, (UINT8 *) Package + Offset, PackageHeader.Length - Offset);\r
+        UpdatePackageLength += PackageHeader.Length - Offset;\r
+\r
         //\r
         // Set update flag\r
         //\r
         Updated = TRUE;\r
+        break;\r
       }\r
     }\r
 \r
@@ -2311,7 +2311,7 @@ InternalHiiUpdateFormPackageData (
   //\r
   // Update the package length.\r
   //\r
-  PackageHeader.Length = UpdatePackageLength;\r
+  PackageHeader.Length = (UINT32) UpdatePackageLength;\r
   CopyMem (TempPackage, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));\r
 \r
   return EFI_SUCCESS;\r