Skip to content

Commit

Permalink
MdeModulePkg/PartitionDxe: Revert changes for the special MBR
Browse files Browse the repository at this point in the history
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2823

Revert "MdeModulePkg/PartitionDxe: Skip the MBR that add for CD-ROM"

Follow the spec definition, the ISO 9660 (and UDF) would be
checked before the MBR. So it is not required to skip such
MBR talbe that contian the entire block device.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Gary Lin <glin@suse.com>
Cc: Andrew Fish <afish@apple.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Tested-by: Gary Lin <glin@suse.com>
  • Loading branch information
ZhichaoGao authored and mergify[bot] committed Aug 13, 2020
1 parent f0f7140 commit 94b7df5
Showing 1 changed file with 6 additions and 31 deletions.
37 changes: 6 additions & 31 deletions MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ PartitionValidMbr (
UINT32 StartingLBA;
UINT32 EndingLBA;
UINT32 NewEndingLBA;
UINT32 SizeInLBA;
INTN Index1;
INTN Index2;
BOOLEAN MbrValid;
Expand All @@ -52,34 +51,13 @@ PartitionValidMbr (
//
MbrValid = FALSE;
for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) {
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) {
if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0) {
continue;
}

MbrValid = TRUE;
EndingLBA = StartingLBA + SizeInLBA - 1;
StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);
EndingLBA = StartingLBA + UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1;
if (EndingLBA > LastLba) {
//
// Compatibility Errata:
Expand All @@ -99,15 +77,12 @@ PartitionValidMbr (
}

for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) {
StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA);
SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA);

if (Mbr->Partition[Index2].OSIndicator == 0x00 || SizeInLBA == 0) {
if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) == 0) {
continue;
}

NewEndingLBA = StartingLBA + SizeInLBA - 1;
if (NewEndingLBA >= StartingLBA && StartingLBA <= EndingLBA) {
NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1;
if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA) {
//
// This region overlaps with the Index1'th region
//
Expand Down

0 comments on commit 94b7df5

Please sign in to comment.