summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorZhichao Gao <zhichao.gao@intel.com>2020-07-06 14:21:10 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2020-07-15 01:18:13 +0000
commita35de0aff3e92c8584419720be199ccfff9b6a43 (patch)
treed4731eb1dc34cfb86a88299329ee2172654eccb9 /MdeModulePkg
parent256c4470f86e53661c070f8c64a1052e975f9ef0 (diff)
downloadedk2-a35de0aff3e92c8584419720be199ccfff9b6a43.tar.gz
edk2-a35de0aff3e92c8584419720be199ccfff9b6a43.tar.bz2
edk2-a35de0aff3e92c8584419720be199ccfff9b6a43.zip
MdeModulePkg/PartitionDxe: Correct the MBR last block value
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2823 PartitionValidMbr function's second parameter should be the last sector of the device. For MBR partition, the block size is sector size, i.e. 512 bytes. The original value is media block last LBA which is counted by the media block size. And media block size is not always 512 bytes, it may be larger which would cause the MBR boundary check incorrect. The boundary check is based on the partition entry start LBA and size of LBA which are both counted by the sector number (512 bytes). 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>
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
index dac451a144..f0c92aa09a 100644
--- a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
+++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
@@ -135,14 +135,17 @@ PartitionInstallMbrChildHandles (
EFI_DEVICE_PATH_PROTOCOL *LastDevicePathNode;
UINT32 BlockSize;
UINT32 MediaId;
- EFI_LBA LastBlock;
+ EFI_LBA LastSector;
EFI_PARTITION_INFO_PROTOCOL PartitionInfo;
Found = EFI_NOT_FOUND;
- BlockSize = BlockIo->Media->BlockSize;
- MediaId = BlockIo->Media->MediaId;
- LastBlock = BlockIo->Media->LastBlock;
+ BlockSize = BlockIo->Media->BlockSize;
+ MediaId = BlockIo->Media->MediaId;
+ LastSector = DivU64x32 (
+ MultU64x32 (BlockIo->Media->LastBlock + 1, BlockSize),
+ MBR_SIZE
+ ) - 1;
//
// Ensure the block size can hold the MBR
@@ -167,7 +170,7 @@ PartitionInstallMbrChildHandles (
Found = Status;
goto Done;
}
- if (!PartitionValidMbr (Mbr, LastBlock)) {
+ if (!PartitionValidMbr (Mbr, LastSector)) {
goto Done;
}
//