diff options
author | Zhichao Gao <zhichao.gao@intel.com> | 2020-07-06 14:21:10 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2020-07-15 01:18:13 +0000 |
commit | a35de0aff3e92c8584419720be199ccfff9b6a43 (patch) | |
tree | d4731eb1dc34cfb86a88299329ee2172654eccb9 /MdeModulePkg | |
parent | 256c4470f86e53661c070f8c64a1052e975f9ef0 (diff) | |
download | edk2-a35de0aff3e92c8584419720be199ccfff9b6a43.zip edk2-a35de0aff3e92c8584419720be199ccfff9b6a43.tar.gz edk2-a35de0aff3e92c8584419720be199ccfff9b6a43.tar.bz2 |
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.c | 13 |
1 files changed, 8 insertions, 5 deletions
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;
}
//
|