]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVol/FwVol.c
MdeModulePkg/DxeCore: Ensure FfsFileHeader 8 bytes aligned
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / FwVol.c
index f4a617918829a52924926f895de9a15b220d6a81..28fce46a956fd430d1c2b9f1ce760e6b4a500e82 100644 (file)
@@ -3,7 +3,7 @@
   Layers on top of Firmware Block protocol to produce a file abstraction\r
   of FV based files.\r
 \r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 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
@@ -34,8 +34,8 @@ FV_DEVICE mFvDevice = {
     FvReadFile,\r
     FvReadFileSection,\r
     FvWriteFile,\r
-    FvGetNextFile,   \r
-       sizeof (UINTN),\r
+    FvGetNextFile,\r
+  sizeof (UINTN),\r
     NULL,\r
     FvGetVolumeInfo,\r
     FvSetVolumeInfo\r
@@ -56,7 +56,7 @@ FV_DEVICE mFvDevice = {
 // FFS helper functions\r
 //\r
 /**\r
-  Read data from Firmware Block by FVB protocol Read. \r
+  Read data from Firmware Block by FVB protocol Read.\r
   The data may cross the multi block ranges.\r
 \r
   @param  Fvb                   The FW_VOL_BLOCK_PROTOCOL instance from which to read data.\r
@@ -86,7 +86,7 @@ ReadFvbData (
   UINTN                       BlockIndex;\r
   UINTN                       ReadDataSize;\r
   EFI_STATUS                  Status;\r
-  \r
+\r
   //\r
   // Try read data in current block\r
   //\r
@@ -102,7 +102,7 @@ ReadFvbData (
     //\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Data crosses the blocks, read data from next block\r
   //\r
@@ -118,7 +118,7 @@ ReadFvbData (
     //\r
     // Read data from the crossing blocks\r
     //\r
-    BlockIndex = 0; \r
+    BlockIndex = 0;\r
     while (BlockIndex < NumberOfBlocks && DataSize >= BlockSize) {\r
       Status = Fvb->Read (Fvb, *StartLba + BlockIndex, 0, &BlockSize, Data);\r
       if (EFI_ERROR (Status)) {\r
@@ -128,20 +128,20 @@ ReadFvbData (
       DataSize -= BlockSize;\r
       BlockIndex ++;\r
     }\r
-    \r
+\r
     //\r
     // Data doesn't exceed the current block range.\r
     //\r
     if (DataSize < BlockSize) {\r
       break;\r
     }\r
-    \r
+\r
     //\r
     // Data must be got from the next block range.\r
     //\r
     *StartLba += NumberOfBlocks;\r
   }\r
-  \r
+\r
   //\r
   // read the remaining data\r
   //\r
@@ -151,7 +151,7 @@ ReadFvbData (
       return Status;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Update Lba and Offset used by the following read.\r
   //\r
@@ -189,7 +189,7 @@ GetFwVolHeader (
   EFI_LBA                     StartLba;\r
   UINTN                       Offset;\r
   UINT8                       *Buffer;\r
-  \r
+\r
   //\r
   // Read the standard FV header\r
   //\r
@@ -329,8 +329,6 @@ FvCheck (
   FFS_FILE_LIST_ENTRY                   *FfsFileEntry;\r
   EFI_FFS_FILE_HEADER                   *FfsHeader;\r
   UINT8                                 *CacheLocation;\r
-  UINTN                                 LbaOffset;\r
-  UINTN                                 HeaderSize;\r
   UINTN                                 Index;\r
   EFI_LBA                               LbaIndex;\r
   UINTN                                 Size;\r
@@ -353,11 +351,7 @@ FvCheck (
     return Status;\r
   }\r
 \r
-  //\r
-  // Size is the size of the FV minus the head. We have already allocated\r
-  // the header to check to make sure the volume is valid\r
-  //\r
-  Size = (UINTN)(FwVolHeader->FvLength - FwVolHeader->HeaderLength);\r
+  Size = (UINTN) FwVolHeader->FvLength;\r
   if ((FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {\r
     FvDevice->IsMemoryMapped = TRUE;\r
 \r
@@ -369,7 +363,7 @@ FvCheck (
     //\r
     // Don't cache memory mapped FV really.\r
     //\r
-    FvDevice->CachedFv = (UINT8 *) (UINTN) (PhysicalAddress + FwVolHeader->HeaderLength);\r
+    FvDevice->CachedFv = (UINT8 *) (UINTN) PhysicalAddress;\r
   } else {\r
     FvDevice->IsMemoryMapped = FALSE;\r
     FvDevice->CachedFv = AllocatePool (Size);\r
@@ -380,52 +374,27 @@ FvCheck (
   }\r
 \r
   //\r
-  // Remember a pointer to the end fo the CachedFv\r
+  // Remember a pointer to the end of the CachedFv\r
   //\r
   FvDevice->EndOfCachedFv = FvDevice->CachedFv + Size;\r
 \r
   if (!FvDevice->IsMemoryMapped) {\r
     //\r
-    // Copy FV minus header into memory using the block map we have all ready\r
-    // read into memory.\r
+    // Copy FV into memory using the block map.\r
     //\r
     BlockMap = FwVolHeader->BlockMap;\r
     CacheLocation = FvDevice->CachedFv;\r
     LbaIndex = 0;\r
-    LbaOffset = 0;\r
-    HeaderSize = FwVolHeader->HeaderLength;\r
     while ((BlockMap->NumBlocks != 0) || (BlockMap->Length != 0)) {\r
-      Index = 0;\r
-      Size  = BlockMap->Length;\r
-      if (HeaderSize > 0) {\r
-        //\r
-        // Skip header size\r
-        //\r
-        for (; Index < BlockMap->NumBlocks && HeaderSize >= BlockMap->Length; Index ++) {\r
-          HeaderSize -= BlockMap->Length;\r
-          LbaIndex ++;\r
-        }\r
-\r
-        //\r
-        // Check whether FvHeader is crossing the multi block range.\r
-        //\r
-        if (Index >= BlockMap->NumBlocks) {\r
-          BlockMap++;\r
-          continue;\r
-        } else if (HeaderSize > 0) {\r
-          LbaOffset = HeaderSize;\r
-          Size = BlockMap->Length - HeaderSize;\r
-          HeaderSize = 0;\r
-        }\r
-      }\r
-    \r
       //\r
-      // read the FV data  \r
+      // read the FV data\r
       //\r
-      for (; Index < BlockMap->NumBlocks; Index ++) {\r
-        Status = Fvb->Read (Fvb,\r
+      Size = BlockMap->Length;\r
+      for (Index = 0; Index < BlockMap->NumBlocks; Index++) {\r
+        Status = Fvb->Read (\r
+                        Fvb,\r
                         LbaIndex,\r
-                        LbaOffset,\r
+                        0,\r
                         &Size,\r
                         CacheLocation\r
                         );\r
@@ -438,13 +407,7 @@ FvCheck (
         }\r
 \r
         LbaIndex++;\r
-        CacheLocation += Size;\r
-\r
-        //\r
-        // After we skip Fv Header always read from start of block\r
-        //\r
-        LbaOffset = 0;\r
-        Size  = BlockMap->Length;\r
+        CacheLocation += BlockMap->Length;\r
       }\r
 \r
       BlockMap++;\r
@@ -475,14 +438,14 @@ FvCheck (
     //\r
     // Searching for files starts on an 8 byte aligned boundary after the end of the Extended Header if it exists.\r
     //\r
-    FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) (FvDevice->CachedFv + (FwVolHeader->ExtHeaderOffset - FwVolHeader->HeaderLength));\r
+    FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) (FvDevice->CachedFv + FwVolHeader->ExtHeaderOffset);\r
     FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolExtHeader + FwVolExtHeader->ExtHeaderSize);\r
-    FfsHeader = (EFI_FFS_FILE_HEADER *) ALIGN_POINTER (FfsHeader, 8);\r
   } else {\r
-    FfsHeader = (EFI_FFS_FILE_HEADER *) (FvDevice->CachedFv);\r
+    FfsHeader = (EFI_FFS_FILE_HEADER *) (FvDevice->CachedFv + FwVolHeader->HeaderLength);\r
   }\r
+  FfsHeader = (EFI_FFS_FILE_HEADER *) ALIGN_POINTER (FfsHeader, 8);\r
   TopFvAddress = FvDevice->EndOfCachedFv;\r
-  while ((UINT8 *) FfsHeader < TopFvAddress) {\r
+  while (((UINTN) FfsHeader >= (UINTN) FvDevice->CachedFv) && ((UINTN) FfsHeader <= (UINTN) ((UINTN) TopFvAddress - sizeof (EFI_FFS_FILE_HEADER)))) {\r
 \r
     if (FileCached) {\r
       CoreFreePool (CacheFfsHeader);\r
@@ -554,7 +517,7 @@ FvCheck (
         DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &CacheFfsHeader->Name));\r
         FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + FFS_FILE2_SIZE (CacheFfsHeader));\r
         //\r
-        // Adjust pointer to the next 8-byte aligned boundry.\r
+        // Adjust pointer to the next 8-byte aligned boundary.\r
         //\r
         FfsHeader = (EFI_FFS_FILE_HEADER *) (((UINTN) FfsHeader + 7) & ~0x07);\r
         continue;\r
@@ -589,7 +552,7 @@ FvCheck (
     }\r
 \r
     //\r
-    // Adjust pointer to the next 8-byte aligned boundry.\r
+    // Adjust pointer to the next 8-byte aligned boundary.\r
     //\r
     FfsHeader = (EFI_FFS_FILE_HEADER *)(((UINTN)FfsHeader + 7) & ~0x07);\r
 \r
@@ -711,14 +674,11 @@ NotifyFwVolBlock (
       FvDevice->FwVolHeader     = FwVolHeader;\r
       FvDevice->IsFfs3Fv        = CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid);\r
       FvDevice->Fv.ParentHandle = Fvb->ParentHandle;\r
+      //\r
+      // Inherit the authentication status from FVB.\r
+      //\r
+      FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
 \r
-      if (Fvb->ParentHandle != NULL) {\r
-        //\r
-        // Inherit the authentication status from FVB.\r
-        //\r
-        FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
-      }\r
-      \r
       if (!EFI_ERROR (FvCheck (FvDevice))) {\r
         //\r
         // Install an New FV protocol on the existing handle\r