]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/PartitionDxe/Gpt.c
Add DiskIo2 protocol definition to MdePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / PartitionDxe / Gpt.c
index a54bd48ba9b6b80f0dd137a5cd84ebf53bbd97bd..35860515c13b9da3284b2a5f0d5c57cad2032016 100644 (file)
@@ -2,8 +2,19 @@
   Decode a hard disk partitioned with the GPT scheme in the UEFI 2.0\r
   specification.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+  Caution: This file requires additional review when modified.\r
+  This driver will have external input - disk partition.\r
+  This external input must be validated carefully to avoid security issue like\r
+  buffer overflow, integer overflow.\r
+\r
+  PartitionInstallGptChildHandles() routine will read disk partition content and\r
+  do basic validation before PartitionInstallChildHandle().\r
+\r
+  PartitionValidGptTable(), PartitionCheckGptEntry() routine will accept disk\r
+  partition content and validate the GPT table and GPT entry.\r
+\r
+Copyright (c) 2006 - 2013, 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
 http://opensource.org/licenses/bsd-license.php\r
@@ -16,11 +27,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "Partition.h"\r
 \r
-\r
 /**\r
   Install child handles if the Handle supports GPT partition structure.\r
 \r
-  @param[in]  BlockIo     Parent BlockIo interface\r
+  Caution: This function may receive untrusted input.\r
+  The GPT partition table header is external input, so this routine\r
+  will do basic validation for GPT partition table header before return.\r
+\r
+  @param[in]  BlockIo     Parent BlockIo interface.\r
   @param[in]  DiskIo      Disk Io protocol.\r
   @param[in]  Lba         The starting Lba of the Partition Table\r
   @param[out] PartHeader  Stores the partition table that is read\r
@@ -37,7 +51,6 @@ PartitionValidGptTable (
   OUT EFI_PARTITION_TABLE_HEADER  *PartHeader\r
   );\r
 \r
-\r
 /**\r
   Check if the CRC field in the Partition table header is valid\r
   for Partition entry array.\r
@@ -60,11 +73,11 @@ PartitionCheckGptEntryArrayCRC (
 \r
 /**\r
   Restore Partition Table to its alternate place\r
-  (Primary -> Backup or Backup -> Primary)\r
+  (Primary -> Backup or Backup -> Primary).\r
 \r
-  @param[in]  BlockIo     Parent BlockIo interface\r
+  @param[in]  BlockIo     Parent BlockIo interface.\r
   @param[in]  DiskIo      Disk Io Protocol.\r
-  @param[in]  PartHeader  Partition table header structure\r
+  @param[in]  PartHeader  Partition table header structure.\r
 \r
   @retval TRUE      Restoring succeeds\r
   @retval FALSE     Restoring failed\r
@@ -79,8 +92,11 @@ PartitionRestoreGptTable (
 \r
 \r
 /**\r
-  Restore Partition Table to its alternate place.\r
-  (Primary -> Backup or Backup -> Primary)\r
+  This routine will check GPT partition entry and return entry status.\r
+\r
+  Caution: This function may receive untrusted input.\r
+  The GPT partition entry is external input, so this routine\r
+  will do basic validation for GPT partition entry and report status.\r
 \r
   @param[in]    PartHeader    Partition table header structure\r
   @param[in]    PartEntry     The partition entry array\r
@@ -160,15 +176,22 @@ PartitionSetCrc (
 /**\r
   Install child handles if the Handle supports GPT partition structure.\r
 \r
-  @param[in]  This       - Calling context.\r
-  @param[in]  Handle     - Parent Handle\r
-  @param[in]  DiskIo     - Parent DiskIo interface\r
-  @param[in]  BlockIo    - Parent BlockIo interface\r
-  @param[in]  DevicePath - Parent Device Path\r
+  Caution: This function may receive untrusted input.\r
+  The GPT partition table is external input, so this routine\r
+  will do basic validation for GPT partition table before install\r
+  child handle for each GPT partition.\r
+\r
+  @param[in]  This       Calling context.\r
+  @param[in]  Handle     Parent Handle.\r
+  @param[in]  DiskIo     Parent DiskIo interface.\r
+  @param[in]  DiskIo2    Parent DiskIo2 interface.\r
+  @param[in]  BlockIo    Parent BlockIo interface.\r
+  @param[in]  BlockIo2   Parent BlockIo2 interface.\r
+  @param[in]  DevicePath Parent Device Path.\r
 \r
-  @retval EFI_SUCCESS         Valid GPT disk\r
-  @retval EFI_MEDIA_CHANGED   Media changed Detected\r
-  @retval other               Not a valid GPT disk\r
+  @retval EFI_SUCCESS           Valid GPT disk.\r
+  @retval EFI_MEDIA_CHANGED     Media changed Detected.\r
+  @retval other                 Not a valid GPT disk.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -176,7 +199,9 @@ PartitionInstallGptChildHandles (
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
   IN  EFI_DISK_IO_PROTOCOL         *DiskIo,\r
+  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,\r
   IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,\r
+  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,\r
   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
@@ -187,10 +212,12 @@ PartitionInstallGptChildHandles (
   EFI_PARTITION_TABLE_HEADER  *PrimaryHeader;\r
   EFI_PARTITION_TABLE_HEADER  *BackupHeader;\r
   EFI_PARTITION_ENTRY         *PartEntry;\r
+  EFI_PARTITION_ENTRY         *Entry;\r
   EFI_PARTITION_ENTRY_STATUS  *PEntryStatus;\r
   UINTN                       Index;\r
   EFI_STATUS                  GptValidStatus;\r
   HARDDRIVE_DEVICE_PATH       HdDev;\r
+  UINT32                      MediaId;\r
 \r
   ProtectiveMbr = NULL;\r
   PrimaryHeader = NULL;\r
@@ -200,6 +227,7 @@ PartitionInstallGptChildHandles (
 \r
   BlockSize     = BlockIo->Media->BlockSize;\r
   LastBlock     = BlockIo->Media->LastBlock;\r
+  MediaId       = BlockIo->Media->MediaId;\r
 \r
   DEBUG ((EFI_D_INFO, " BlockSize : %d \n", BlockSize));\r
   DEBUG ((EFI_D_INFO, " LastBlock : %lx \n", LastBlock));\r
@@ -219,22 +247,28 @@ PartitionInstallGptChildHandles (
   //\r
   Status = DiskIo->ReadDisk (\r
                      DiskIo,\r
-                     BlockIo->Media->MediaId,\r
+                     MediaId,\r
                      0,\r
-                     BlockIo->Media->BlockSize,\r
+                     BlockSize,\r
                      ProtectiveMbr\r
                      );\r
   if (EFI_ERROR (Status)) {\r
     GptValidStatus = Status;\r
     goto Done;\r
   }\r
+\r
   //\r
   // Verify that the Protective MBR is valid\r
   //\r
-  if (ProtectiveMbr->Partition[0].BootIndicator != 0x00 ||\r
-      ProtectiveMbr->Partition[0].OSIndicator != PMBR_GPT_PARTITION ||\r
-      UNPACK_UINT32 (ProtectiveMbr->Partition[0].StartingLBA) != 1\r
-      ) {\r
+  for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {\r
+    if (ProtectiveMbr->Partition[Index].BootIndicator == 0x00 &&\r
+        ProtectiveMbr->Partition[Index].OSIndicator == PMBR_GPT_PARTITION &&\r
+        UNPACK_UINT32 (ProtectiveMbr->Partition[Index].StartingLBA) == 1\r
+        ) {\r
+      break;\r
+    }\r
+  }\r
+  if (Index == MAX_MBR_PARTITIONS) {\r
     goto Done;\r
   }\r
 \r
@@ -275,7 +309,7 @@ PartitionInstallGptChildHandles (
     DEBUG ((EFI_D_INFO, " Valid primary and !Valid backup partition table\n"));\r
     DEBUG ((EFI_D_INFO, " Restore backup partition table by the primary\n"));\r
     if (!PartitionRestoreGptTable (BlockIo, DiskIo, PrimaryHeader)) {\r
-      DEBUG ((EFI_D_INFO, " Restore  backup partition table error\n"));\r
+      DEBUG ((EFI_D_INFO, " Restore backup partition table error\n"));\r
     }\r
 \r
     if (PartitionValidGptTable (BlockIo, DiskIo, PrimaryHeader->AlternateLBA, BackupHeader)) {\r
@@ -289,7 +323,7 @@ PartitionInstallGptChildHandles (
   //\r
   // Read the EFI Partition Entries\r
   //\r
-  PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * sizeof (EFI_PARTITION_ENTRY));\r
+  PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * PrimaryHeader->SizeOfPartitionEntry);\r
   if (PartEntry == NULL) {\r
     DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));\r
     goto Done;\r
@@ -297,7 +331,7 @@ PartitionInstallGptChildHandles (
 \r
   Status = DiskIo->ReadDisk (\r
                      DiskIo,\r
-                     BlockIo->Media->MediaId,\r
+                     MediaId,\r
                      MultU64x32(PrimaryHeader->PartitionEntryLBA, BlockSize),\r
                      PrimaryHeader->NumberOfPartitionEntries * (PrimaryHeader->SizeOfPartitionEntry),\r
                      PartEntry\r
@@ -332,12 +366,15 @@ PartitionInstallGptChildHandles (
   // Create child device handles\r
   //\r
   for (Index = 0; Index < PrimaryHeader->NumberOfPartitionEntries; Index++) {\r
-    if (CompareGuid (&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||\r
+    Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index * PrimaryHeader->SizeOfPartitionEntry);\r
+    if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||\r
         PEntryStatus[Index].OutOfRange ||\r
-        PEntryStatus[Index].Overlap\r
+        PEntryStatus[Index].Overlap ||\r
+        PEntryStatus[Index].OsSpecific\r
         ) {\r
       //\r
-      // Don't use null EFI Partition Entries or Invalid Partition Entries\r
+      // Don't use null EFI Partition Entries, Invalid Partition Entries or OS specific\r
+      // partition Entries\r
       //\r
       continue;\r
     }\r
@@ -350,29 +387,31 @@ PartitionInstallGptChildHandles (
     HdDev.PartitionNumber = (UINT32) Index + 1;\r
     HdDev.MBRType         = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
     HdDev.SignatureType   = SIGNATURE_TYPE_GUID;\r
-    HdDev.PartitionStart  = PartEntry[Index].StartingLBA;\r
-    HdDev.PartitionSize   = PartEntry[Index].EndingLBA - PartEntry[Index].StartingLBA + 1;\r
-    CopyMem (HdDev.Signature, &PartEntry[Index].UniquePartitionGUID, sizeof (EFI_GUID));\r
+    HdDev.PartitionStart  = Entry->StartingLBA;\r
+    HdDev.PartitionSize   = Entry->EndingLBA - Entry->StartingLBA + 1;\r
+    CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));\r
 \r
     DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32) Index));\r
     DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64) HdDev.PartitionStart));\r
-    DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) PartEntry[Index].EndingLBA));\r
+    DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) Entry->EndingLBA));\r
     DEBUG ((EFI_D_INFO, " Partition size: %lx\n", (UINT64) HdDev.PartitionSize));\r
-    DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (PartEntry[Index].StartingLBA, BlockSize)));\r
-    DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (PartEntry[Index].EndingLBA, BlockSize)));\r
+    DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (Entry->StartingLBA, BlockSize)));\r
+    DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (Entry->EndingLBA, BlockSize)));\r
 \r
     Status = PartitionInstallChildHandle (\r
-              This,\r
-              Handle,\r
-              DiskIo,\r
-              BlockIo,\r
-              DevicePath,\r
-              (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
-              PartEntry[Index].StartingLBA,\r
-              PartEntry[Index].EndingLBA,\r
-              BlockSize,\r
-              CompareGuid(&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
-              );\r
+               This,\r
+               Handle,\r
+               DiskIo,\r
+               DiskIo2,\r
+               BlockIo,\r
+               BlockIo2,\r
+               DevicePath,\r
+               (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+               Entry->StartingLBA,\r
+               Entry->EndingLBA,\r
+               BlockSize,\r
+               CompareGuid(&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
+               );\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "Prepare to Free Pool\n"));\r
@@ -397,11 +436,14 @@ Done:
   return GptValidStatus;\r
 }\r
 \r
-\r
 /**\r
-  Install child handles if the Handle supports GPT partition structure.\r
+  This routine will read GPT partition table header and return it.\r
 \r
-  @param[in]  BlockIo     Parent BlockIo interface\r
+  Caution: This function may receive untrusted input.\r
+  The GPT partition table header is external input, so this routine\r
+  will do basic validation for GPT partition table header before return.\r
+\r
+  @param[in]  BlockIo     Parent BlockIo interface.\r
   @param[in]  DiskIo      Disk Io protocol.\r
   @param[in]  Lba         The starting Lba of the Partition Table\r
   @param[out] PartHeader  Stores the partition table that is read\r
@@ -421,9 +463,10 @@ PartitionValidGptTable (
   EFI_STATUS                  Status;\r
   UINT32                      BlockSize;\r
   EFI_PARTITION_TABLE_HEADER  *PartHdr;\r
+  UINT32                      MediaId;\r
 \r
   BlockSize = BlockIo->Media->BlockSize;\r
-\r
+  MediaId   = BlockIo->Media->MediaId;\r
   PartHdr   = AllocateZeroPool (BlockSize);\r
 \r
   if (PartHdr == NULL) {\r
@@ -435,7 +478,7 @@ PartitionValidGptTable (
   //\r
   Status = DiskIo->ReadDisk (\r
                      DiskIo,\r
-                     BlockIo->Media->MediaId,\r
+                     MediaId,\r
                      MultU64x32 (Lba, BlockSize),\r
                      BlockSize,\r
                      PartHdr\r
@@ -447,13 +490,22 @@ PartitionValidGptTable (
 \r
   if ((PartHdr->Header.Signature != EFI_PTAB_HEADER_ID) ||\r
       !PartitionCheckCrc (BlockSize, &PartHdr->Header) ||\r
-      PartHdr->MyLBA != Lba\r
+      PartHdr->MyLBA != Lba ||\r
+      (PartHdr->SizeOfPartitionEntry < sizeof (EFI_PARTITION_ENTRY))\r
       ) {\r
     DEBUG ((EFI_D_INFO, "Invalid efi partition table header\n"));\r
     FreePool (PartHdr);\r
     return FALSE;\r
   }\r
 \r
+  //\r
+  // Ensure the NumberOfPartitionEntries * SizeOfPartitionEntry doesn't overflow.\r
+  //\r
+  if (PartHdr->NumberOfPartitionEntries > DivU64x32 (MAX_UINTN, PartHdr->SizeOfPartitionEntry)) {\r
+    FreePool (PartHdr);\r
+    return FALSE;\r
+  }\r
+\r
   CopyMem (PartHeader, PartHdr, sizeof (EFI_PARTITION_TABLE_HEADER));\r
   if (!PartitionCheckGptEntryArrayCRC (BlockIo, DiskIo, PartHeader)) {\r
     FreePool (PartHdr);\r
@@ -465,7 +517,6 @@ PartitionValidGptTable (
   return TRUE;\r
 }\r
 \r
-\r
 /**\r
   Check if the CRC field in the Partition table header is valid\r
   for Partition entry array.\r
@@ -528,11 +579,11 @@ PartitionCheckGptEntryArrayCRC (
 \r
 /**\r
   Restore Partition Table to its alternate place\r
-  (Primary -> Backup or Backup -> Primary)\r
+  (Primary -> Backup or Backup -> Primary).\r
 \r
-  @param[in]  BlockIo     Parent BlockIo interface\r
+  @param[in]  BlockIo     Parent BlockIo interface.\r
   @param[in]  DiskIo      Disk Io Protocol.\r
-  @param[in]  PartHeader  Partition table header structure\r
+  @param[in]  PartHeader  Partition table header structure.\r
 \r
   @retval TRUE      Restoring succeeds\r
   @retval FALSE     Restoring failed\r
@@ -550,11 +601,13 @@ PartitionRestoreGptTable (
   EFI_PARTITION_TABLE_HEADER  *PartHdr;\r
   EFI_LBA                     PEntryLBA;\r
   UINT8                       *Ptr;\r
+  UINT32                      MediaId;\r
 \r
   PartHdr   = NULL;\r
   Ptr       = NULL;\r
 \r
   BlockSize = BlockIo->Media->BlockSize;\r
+  MediaId   = BlockIo->Media->MediaId;\r
 \r
   PartHdr   = AllocateZeroPool (BlockSize);\r
 \r
@@ -574,22 +627,28 @@ PartitionRestoreGptTable (
   PartHdr->PartitionEntryLBA  = PEntryLBA;\r
   PartitionSetCrc ((EFI_TABLE_HEADER *) PartHdr);\r
 \r
-  Status = BlockIo->WriteBlocks (BlockIo, BlockIo->Media->MediaId, PartHdr->MyLBA, BlockSize, PartHdr);\r
+  Status = DiskIo->WriteDisk (\r
+                     DiskIo,\r
+                     MediaId,\r
+                     MultU64x32 (PartHdr->MyLBA, (UINT32) BlockSize),\r
+                     BlockSize,\r
+                     PartHdr\r
+                     );\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
   Ptr = AllocatePool (PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry);\r
   if (Ptr == NULL) {\r
-    DEBUG ((EFI_D_ERROR, " Allocate pool effor\n"));\r
+    DEBUG ((EFI_D_ERROR, " Allocate pool error\n"));\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
   Status = DiskIo->ReadDisk (\r
                     DiskIo,\r
-                    BlockIo->Media->MediaId,\r
-                    MultU64x32(PartHeader->PartitionEntryLBA, BlockIo->Media->BlockSize),\r
+                    MediaId,\r
+                    MultU64x32(PartHeader->PartitionEntryLBA, (UINT32) BlockSize),\r
                     PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry,\r
                     Ptr\r
                     );\r
@@ -599,8 +658,8 @@ PartitionRestoreGptTable (
 \r
   Status = DiskIo->WriteDisk (\r
                     DiskIo,\r
-                    BlockIo->Media->MediaId,\r
-                    MultU64x32(PEntryLBA, BlockIo->Media->BlockSize),\r
+                    MediaId,\r
+                    MultU64x32(PEntryLBA, (UINT32) BlockSize),\r
                     PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry,\r
                     Ptr\r
                     );\r
@@ -619,10 +678,12 @@ Done:
   return TRUE;\r
 }\r
 \r
-\r
 /**\r
-  Restore Partition Table to its alternate place.\r
-  (Primary -> Backup or Backup -> Primary)\r
+  This routine will check GPT partition entry and return entry status.\r
+\r
+  Caution: This function may receive untrusted input.\r
+  The GPT partition entry is external input, so this routine\r
+  will do basic validation for GPT partition entry and report status.\r
 \r
   @param[in]    PartHeader    Partition table header structure\r
   @param[in]    PartEntry     The partition entry array\r
@@ -637,19 +698,21 @@ PartitionCheckGptEntry (
   OUT EFI_PARTITION_ENTRY_STATUS  *PEntryStatus\r
   )\r
 {\r
-  EFI_LBA StartingLBA;\r
-  EFI_LBA EndingLBA;\r
-  UINTN   Index1;\r
-  UINTN   Index2;\r
+  EFI_LBA              StartingLBA;\r
+  EFI_LBA              EndingLBA;\r
+  EFI_PARTITION_ENTRY  *Entry;\r
+  UINTN                Index1;\r
+  UINTN                Index2;\r
 \r
   DEBUG ((EFI_D_INFO, " start check partition entries\n"));\r
   for (Index1 = 0; Index1 < PartHeader->NumberOfPartitionEntries; Index1++) {\r
-    if (CompareGuid (&PartEntry[Index1].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
+    Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index1 * PartHeader->SizeOfPartitionEntry);\r
+    if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
       continue;\r
     }\r
 \r
-    StartingLBA = PartEntry[Index1].StartingLBA;\r
-    EndingLBA   = PartEntry[Index1].EndingLBA;\r
+    StartingLBA = Entry->StartingLBA;\r
+    EndingLBA   = Entry->EndingLBA;\r
     if (StartingLBA > EndingLBA ||\r
         StartingLBA < PartHeader->FirstUsableLBA ||\r
         StartingLBA > PartHeader->LastUsableLBA ||\r
@@ -660,20 +723,26 @@ PartitionCheckGptEntry (
       continue;\r
     }\r
 \r
-    for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {\r
+    if ((Entry->Attributes & BIT1) != 0) {\r
+      //\r
+      // If Bit 1 is set, this indicate that this is an OS specific GUID partition. \r
+      //\r
+      PEntryStatus[Index1].OsSpecific = TRUE;\r
+    }\r
 \r
-      if (CompareGuid (&PartEntry[Index2].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
+    for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {\r
+      Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index2 * PartHeader->SizeOfPartitionEntry);\r
+      if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
         continue;\r
       }\r
 \r
-      if (PartEntry[Index2].EndingLBA >= StartingLBA && PartEntry[Index2].StartingLBA <= EndingLBA) {\r
+      if (Entry->EndingLBA >= StartingLBA && Entry->StartingLBA <= EndingLBA) {\r
         //\r
         // This region overlaps with the Index1'th region\r
         //\r
         PEntryStatus[Index1].Overlap  = TRUE;\r
         PEntryStatus[Index2].Overlap  = TRUE;\r
         continue;\r
-\r
       }\r
     }\r
   }\r