]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVol/Ffs.c
Refine code to make it more safely.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / Ffs.c
index 5eb22d0ac5ffa70e02409e43078a15505323006f..20dade18a275c7a4c830cd53d36ced5cda5d05de 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   FFS file access utilities.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2011, 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
@@ -105,18 +105,9 @@ VerifyFvHeaderChecksum (
   IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader\r
   )\r
 {\r
-  UINT32  Index;\r
-  UINT32  HeaderLength;\r
   UINT16  Checksum;\r
-  UINT16  *Ptr;\r
 \r
-  HeaderLength = FvHeader->HeaderLength;\r
-  Ptr = (UINT16 *)FvHeader;\r
-  Checksum = 0;\r
-\r
-  for (Index = 0; Index < HeaderLength / sizeof (UINT16); Index++) {\r
-    Checksum = (UINT16)(Checksum + Ptr[Index]);\r
-  }\r
+  Checksum = CalculateSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength);\r
 \r
   if (Checksum == 0) {\r
     return TRUE;\r
@@ -140,16 +131,13 @@ VerifyHeaderChecksum (
   IN EFI_FFS_FILE_HEADER  *FfsHeader\r
   )\r
 {\r
-  UINT32            Index;\r
-  UINT8             *Ptr;\r
-  UINT8             HeaderChecksum;\r
-\r
-  Ptr = (UINT8 *)FfsHeader;\r
-  HeaderChecksum = 0;\r
-  for (Index = 0; Index < sizeof(EFI_FFS_FILE_HEADER); Index++) {\r
-    HeaderChecksum = (UINT8)(HeaderChecksum + Ptr[Index]);\r
-  }\r
+  UINT8 HeaderChecksum;\r
 \r
+  if (IS_FFS_FILE2 (FfsHeader)) {\r
+    HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER2));\r
+  } else {\r
+    HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER));\r
+  }\r
   HeaderChecksum = (UINT8) (HeaderChecksum - FfsHeader->State - FfsHeader->IntegrityCheck.Checksum.File);\r
 \r
   if (HeaderChecksum == 0) {\r
@@ -218,7 +206,6 @@ IsValidFfsFile (
 {\r
   EFI_FFS_FILE_STATE  FileState;\r
   UINT8               DataCheckSum;\r
-  UINT32              FileLength;\r
 \r
   FileState = GetFileState (ErasePolarity, FfsHeader);\r
   switch (FileState) {\r
@@ -227,9 +214,12 @@ IsValidFfsFile (
   case EFI_FILE_DATA_VALID:\r
   case EFI_FILE_MARKED_FOR_UPDATE:\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
+      if (IS_FFS_FILE2 (FfsHeader)) {\r
+        DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER2));\r
+      } else {\r
+        DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER));\r
+      }\r
     }\r
     if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
       return TRUE;\r