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>
This commit is contained in:
Zhichao Gao 2020-07-06 14:21:10 +08:00 committed by mergify[bot]
parent 256c4470f8
commit a35de0aff3
1 changed files with 8 additions and 5 deletions

View File

@ -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;
}
//