From a35de0aff3e92c8584419720be199ccfff9b6a43 Mon Sep 17 00:00:00 2001 From: Zhichao Gao Date: Mon, 6 Jul 2020 14:21:10 +0800 Subject: 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 Cc: Ray Ni Signed-off-by: Zhichao Gao Reviewed-by: Ray Ni --- MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'MdeModulePkg/Universal/Disk') diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c index dac451a..f0c92aa 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; } // -- cgit v1.1