summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhichao Gao <zhichao.gao@intel.com>2020-07-02 09:03:12 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2020-07-15 01:18:13 +0000
commite906346dcb80fce588ac774c8ec9694b62f0a257 (patch)
tree9846ef8a638d50dd94ced8263c8bce0150c04e78
parenta35de0aff3e92c8584419720be199ccfff9b6a43 (diff)
downloadedk2-e906346dcb80fce588ac774c8ec9694b62f0a257.zip
edk2-e906346dcb80fce588ac774c8ec9694b62f0a257.tar.gz
edk2-e906346dcb80fce588ac774c8ec9694b62f0a257.tar.bz2
MdeModulePkg/PartitionDxe: Skip the MBR that add for CD-ROM
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2823 Refer to http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html. Some Linux ISOs may have the MBR table for compatibility reasons for Windows. The MBR tale would contain the partition entry with start LBA0 and whole media size. There are two methods to check the filesystem in the CD-ROM: 1. MBR partition check (Windows) 2. Whole disk check (MAC OS) UEFI doesn't have the MBR check for UDF and Eltorito. But it may pass the MBR check for such table and fail to detect the filesystem of UDF. Skip the MBR check if the MBR is added for Windows compatiblity so that the partition driver can continue UDF and ElTorito check. Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Signed-off-by: Zhichao Gao <zhichao.gao@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
-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 f0c92aa..3830af1 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
//