]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update PeiCore and DxeCore to verify FFS data checksum.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 23 Feb 2011 03:09:55 +0000 (03:09 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 23 Feb 2011 03:09:55 +0000 (03:09 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11332 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Dxe/FwVol/Ffs.c
MdeModulePkg/Core/Pei/FwVol/FwVol.c

index aec08b221b9b91af14800ff810dd28fae737e7d3..5eb22d0ac5ffa70e02409e43078a15505323006f 100644 (file)
@@ -217,6 +217,8 @@ IsValidFfsFile (
   )\r
 {\r
   EFI_FFS_FILE_STATE  FileState;\r
   )\r
 {\r
   EFI_FFS_FILE_STATE  FileState;\r
+  UINT8               DataCheckSum;\r
+  UINT32              FileLength;\r
 \r
   FileState = GetFileState (ErasePolarity, FfsHeader);\r
   switch (FileState) {\r
 \r
   FileState = GetFileState (ErasePolarity, FfsHeader);\r
   switch (FileState) {\r
@@ -224,11 +226,14 @@ IsValidFfsFile (
   case EFI_FILE_DELETED:\r
   case EFI_FILE_DATA_VALID:\r
   case EFI_FILE_MARKED_FOR_UPDATE:\r
   case EFI_FILE_DELETED:\r
   case EFI_FILE_DATA_VALID:\r
   case EFI_FILE_MARKED_FOR_UPDATE:\r
-    //\r
-    // Some other vliadation like file content checksum might be done here.\r
-    // For performance issue, Tiano only do FileState check.\r
-    //\r
-    return TRUE;\r
+    DataCheckSum = FFS_FIXED_CHECKSUM;\r
+    FileLength   = *(UINT32 *)(FfsHeader->Size) & 0x00FFFFFF;\r
+    if ((FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
+      DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsHeader + sizeof(EFI_FFS_FILE_HEADER), FileLength - sizeof(EFI_FFS_FILE_HEADER));\r
+    }\r
+    if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
+      return TRUE;\r
+    }\r
 \r
   default:\r
     return FALSE;\r
 \r
   default:\r
     return FALSE;\r
index c40f0ea86b0df654d7c79d9e17397c6b88e06325..941657c07f9d4b2e0ed2430b7571af08791d7299 100644 (file)
@@ -162,6 +162,7 @@ FindFileEx (
   UINT64                                FvLength;\r
   UINT8                                 ErasePolarity;\r
   UINT8                                 FileState;\r
   UINT64                                FvLength;\r
   UINT8                                 ErasePolarity;\r
   UINT8                                 FileState;\r
+  UINT8                                 DataCheckSum;\r
   \r
   //\r
   // Convert the handle of FV to FV header for memory-mapped firmware volume\r
   \r
   //\r
   // Convert the handle of FV to FV header for memory-mapped firmware volume\r
@@ -219,6 +220,16 @@ FindFileEx (
       FileLength       = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
       FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
 \r
       FileLength       = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
       FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
 \r
+      DataCheckSum = FFS_FIXED_CHECKSUM;\r
+      if ((FfsFileHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
+        DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER), FileLength - sizeof(EFI_FFS_FILE_HEADER));\r
+      }\r
+      if (FfsFileHeader->IntegrityCheck.Checksum.File != DataCheckSum) {\r
+        ASSERT (FALSE);\r
+        *FileHeader = NULL;\r
+        return EFI_NOT_FOUND;\r
+      }\r
+\r
       if (FileName != NULL) {\r
         if (CompareGuid (&FfsFileHeader->Name, (EFI_GUID*)FileName)) {\r
           *FileHeader = FfsFileHeader;\r
       if (FileName != NULL) {\r
         if (CompareGuid (&FfsFileHeader->Name, (EFI_GUID*)FileName)) {\r
           *FileHeader = FfsFileHeader;\r