mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-29 08:34:07 +02:00
MdeModulePkg PartitionDxe: Ensure the NumberOfPartitionEntries * SizeOfPartitionEntry doesn't overflow.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Chao Zhang <chao.b.zhang@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14520 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
e3df6949e7
commit
b4e027f1c6
@ -13,7 +13,7 @@
|
|||||||
PartitionValidGptTable(), PartitionCheckGptEntry() routine will accept disk
|
PartitionValidGptTable(), PartitionCheckGptEntry() routine will accept disk
|
||||||
partition content and validate the GPT table and GPT entry.
|
partition content and validate the GPT table and GPT entry.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -307,7 +307,7 @@ PartitionInstallGptChildHandles (
|
|||||||
DEBUG ((EFI_D_INFO, " Valid primary and !Valid backup partition table\n"));
|
DEBUG ((EFI_D_INFO, " Valid primary and !Valid backup partition table\n"));
|
||||||
DEBUG ((EFI_D_INFO, " Restore backup partition table by the primary\n"));
|
DEBUG ((EFI_D_INFO, " Restore backup partition table by the primary\n"));
|
||||||
if (!PartitionRestoreGptTable (BlockIo, DiskIo, PrimaryHeader)) {
|
if (!PartitionRestoreGptTable (BlockIo, DiskIo, PrimaryHeader)) {
|
||||||
DEBUG ((EFI_D_INFO, " Restore backup partition table error\n"));
|
DEBUG ((EFI_D_INFO, " Restore backup partition table error\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PartitionValidGptTable (BlockIo, DiskIo, PrimaryHeader->AlternateLBA, BackupHeader)) {
|
if (PartitionValidGptTable (BlockIo, DiskIo, PrimaryHeader->AlternateLBA, BackupHeader)) {
|
||||||
@ -487,13 +487,22 @@ PartitionValidGptTable (
|
|||||||
|
|
||||||
if ((PartHdr->Header.Signature != EFI_PTAB_HEADER_ID) ||
|
if ((PartHdr->Header.Signature != EFI_PTAB_HEADER_ID) ||
|
||||||
!PartitionCheckCrc (BlockSize, &PartHdr->Header) ||
|
!PartitionCheckCrc (BlockSize, &PartHdr->Header) ||
|
||||||
PartHdr->MyLBA != Lba
|
PartHdr->MyLBA != Lba ||
|
||||||
|
(PartHdr->SizeOfPartitionEntry < sizeof (EFI_PARTITION_ENTRY))
|
||||||
) {
|
) {
|
||||||
DEBUG ((EFI_D_INFO, "Invalid efi partition table header\n"));
|
DEBUG ((EFI_D_INFO, "Invalid efi partition table header\n"));
|
||||||
FreePool (PartHdr);
|
FreePool (PartHdr);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Ensure the NumberOfPartitionEntries * SizeOfPartitionEntry doesn't overflow.
|
||||||
|
//
|
||||||
|
if (PartHdr->NumberOfPartitionEntries > DivU64x32 (MAX_UINTN, PartHdr->SizeOfPartitionEntry)) {
|
||||||
|
FreePool (PartHdr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
CopyMem (PartHeader, PartHdr, sizeof (EFI_PARTITION_TABLE_HEADER));
|
CopyMem (PartHeader, PartHdr, sizeof (EFI_PARTITION_TABLE_HEADER));
|
||||||
if (!PartitionCheckGptEntryArrayCRC (BlockIo, DiskIo, PartHeader)) {
|
if (!PartitionCheckGptEntryArrayCRC (BlockIo, DiskIo, PartHeader)) {
|
||||||
FreePool (PartHdr);
|
FreePool (PartHdr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user