summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c')
-rw-r--r--MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
index f0c92aa09a..3830af1ea7 100644
--- a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
+++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
@@ -39,6 +39,7 @@ PartitionValidMbr (
UINT32 StartingLBA;
UINT32 EndingLBA;
UINT32 NewEndingLBA;
+ UINT32 SizeInLBA;
INTN Index1;
INTN Index2;
BOOLEAN MbrValid;
@@ -51,13 +52,34 @@ PartitionValidMbr (
//
MbrValid = FALSE;
for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) {
- if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0) {
+ StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);
+ SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA);
+
+ //
+ // If the MBR with partition entry covering the ENTIRE disk, i.e. start at LBA0
+ // with whole disk size, we treat it as an invalid MBR partition.
+ //
+ if ((StartingLBA == 0) &&
+ (SizeInLBA == (LastLba + 1))) {
+ //
+ // Refer to the http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html
+ // "WHOLE DISK VS PARTITION"
+ // Some linux ISOs may put the MBR table in the first 512 bytes for compatibility reasons with Windows.
+ // Linux kernel ignores MBR table if contains partition which starts at sector 0.
+ // Skip it because we don't have the partition check for UDF(El Torito compatible).
+ // It would continue to do the whole disk check in the UDF routine.
+ //
+ DEBUG ((DEBUG_INFO, "PartitionValidMbr: MBR table has partition entry covering the ENTIRE disk. Don't treat it as a valid MBR.\n"));
+
+ return FALSE;
+ }
+
+ if (Mbr->Partition[Index1].OSIndicator == 0x00 || SizeInLBA == 0) {
continue;
}
MbrValid = TRUE;
- StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);
- EndingLBA = StartingLBA + UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1;
+ EndingLBA = StartingLBA + SizeInLBA - 1;
if (EndingLBA > LastLba) {
//
// Compatibility Errata:
@@ -77,12 +99,15 @@ PartitionValidMbr (
}
for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) {
- if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) == 0) {
+ StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA);
+ SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA);
+
+ if (Mbr->Partition[Index2].OSIndicator == 0x00 || SizeInLBA == 0) {
continue;
}
- NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1;
- if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA) {
+ NewEndingLBA = StartingLBA + SizeInLBA - 1;
+ if (NewEndingLBA >= StartingLBA && StartingLBA <= EndingLBA) {
//
// This region overlaps with the Index1'th region
//