UINT32 StartingLBA;\r
UINT32 EndingLBA;\r
UINT32 NewEndingLBA;\r
+ UINT32 SizeInLBA;\r
INTN Index1;\r
INTN Index2;\r
BOOLEAN MbrValid;\r
//\r
MbrValid = FALSE;\r
for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) {\r
- if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0) {\r
+ StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);\r
+ SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA);\r
+\r
+ //\r
+ // If the MBR with partition entry covering the ENTIRE disk, i.e. start at LBA0\r
+ // with whole disk size, we treat it as an invalid MBR partition.\r
+ //\r
+ if ((StartingLBA == 0) &&\r
+ (SizeInLBA == (LastLba + 1))) {\r
+ //\r
+ // Refer to the http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html\r
+ // "WHOLE DISK VS PARTITION"\r
+ // Some linux ISOs may put the MBR table in the first 512 bytes for compatibility reasons with Windows.\r
+ // Linux kernel ignores MBR table if contains partition which starts at sector 0.\r
+ // Skip it because we don't have the partition check for UDF(El Torito compatible).\r
+ // It would continue to do the whole disk check in the UDF routine.\r
+ //\r
+ DEBUG ((DEBUG_INFO, "PartitionValidMbr: MBR table has partition entry covering the ENTIRE disk. Don't treat it as a valid MBR.\n"));\r
+\r
+ return FALSE;\r
+ }\r
+\r
+ if (Mbr->Partition[Index1].OSIndicator == 0x00 || SizeInLBA == 0) {\r
continue;\r
}\r
\r
MbrValid = TRUE;\r
- StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);\r
- EndingLBA = StartingLBA + UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1;\r
+ EndingLBA = StartingLBA + SizeInLBA - 1;\r
if (EndingLBA > LastLba) {\r
//\r
// Compatibility Errata:\r
}\r
\r
for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) {\r
- if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) == 0) {\r
+ StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA);\r
+ SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA);\r
+\r
+ if (Mbr->Partition[Index2].OSIndicator == 0x00 || SizeInLBA == 0) {\r
continue;\r
}\r
\r
- NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1;\r
- if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA) {\r
+ NewEndingLBA = StartingLBA + SizeInLBA - 1;\r
+ if (NewEndingLBA >= StartingLBA && StartingLBA <= EndingLBA) {\r
//\r
// This region overlaps with the Index1'th region\r
//\r