From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com []) by mx.groups.io with SMTP id smtpd.web10.2735.1594175250936997826 for ; Tue, 07 Jul 2020 19:27:33 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: zhichao.gao@intel.com) IronPort-SDR: xzAbnBTKrCha82yARPkdU3c3BB1SY7k80OlWIGxzYAagKarBXMeSh2dO8uB2TaW/YFaL28tFSr 0s3qmnANh91Q== X-IronPort-AV: E=McAfee;i="6000,8403,9675"; a="127325773" X-IronPort-AV: E=Sophos;i="5.75,326,1589266800"; d="scan'208";a="127325773" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Jul 2020 19:27:33 -0700 IronPort-SDR: qr/cQNCoNceofEj54TokTpmpVoOvdGfrHbaVfQYJLAJu2Xv1Y8tQCtuOfGtvxTcFc5pbDclErD mvBTSdYm3FQQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,326,1589266800"; d="scan'208";a="483722347" Received: from fieedk001.ccr.corp.intel.com ([10.239.33.114]) by fmsmga005.fm.intel.com with ESMTP; 07 Jul 2020 19:27:31 -0700 From: "Gao, Zhichao" To: devel@edk2.groups.io Cc: Hao A Wu , Ray Ni , Laszlo Ersek Subject: [PATCH V2 2/3] MdeModulePkg/PartitionDxe: Skip the MBR that add for CD-ROM Date: Wed, 8 Jul 2020 10:27:21 +0800 Message-Id: <20200708022722.27024-3-zhichao.gao@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20200708022722.27024-1-zhichao.gao@intel.com> References: <20200708022722.27024-1-zhichao.gao@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Cc: Ray Ni Cc: Laszlo Ersek Signed-off-by: Zhichao Gao --- .../Universal/Disk/PartitionDxe/Mbr.c | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c index aa0b6cadcc..b5cb56842a 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,35 @@ 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 contains itself, i.e. start with LBA0, + // and have the same size with the media, we treat it as a El Torito partition. + // + if ((StartingLBA == 0) && + (SizeInLBA != 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: The MBR table has partition entry start at sector 0.\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 +100,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 // -- 2.21.0.windows.1