boot: Refuse GPT with invalid entry size
SizeOfPartitionEntry must be a multiple of 128 * 2^n.
This commit is contained in:
+6
-12
@@ -67,7 +67,7 @@ static bool verify_gpt(union GptHeaderBuffer *gpt_header_buffer, EFI_LBA lba_exp
|
|||||||
if (h->MyLBA != lba_expected)
|
if (h->MyLBA != lba_expected)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (h->SizeOfPartitionEntry < sizeof(EFI_PARTITION_ENTRY))
|
if ((h->SizeOfPartitionEntry % sizeof(EFI_PARTITION_ENTRY)) != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (h->NumberOfPartitionEntries <= 0 || h->NumberOfPartitionEntries > 1024)
|
if (h->NumberOfPartitionEntries <= 0 || h->NumberOfPartitionEntries > 1024)
|
||||||
@@ -130,19 +130,13 @@ static EFI_STATUS try_gpt(
|
|||||||
|
|
||||||
/* Now we can finally look for xbootloader partitions. */
|
/* Now we can finally look for xbootloader partitions. */
|
||||||
for (UINTN i = 0; i < gpt.gpt_header.NumberOfPartitionEntries; i++) {
|
for (UINTN i = 0; i < gpt.gpt_header.NumberOfPartitionEntries; i++) {
|
||||||
EFI_PARTITION_ENTRY *entry;
|
EFI_PARTITION_ENTRY *entry =
|
||||||
EFI_LBA start, end;
|
(EFI_PARTITION_ENTRY *) ((uint8_t *) entries + gpt.gpt_header.SizeOfPartitionEntry * i);
|
||||||
|
|
||||||
entry = (EFI_PARTITION_ENTRY*) ((uint8_t*) entries + gpt.gpt_header.SizeOfPartitionEntry * i);
|
|
||||||
|
|
||||||
if (memcmp(&entry->PartitionTypeGUID, XBOOTLDR_GUID, sizeof(entry->PartitionTypeGUID)) != 0)
|
if (memcmp(&entry->PartitionTypeGUID, XBOOTLDR_GUID, sizeof(entry->PartitionTypeGUID)) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Let's use memcpy(), in case the structs are not aligned (they really should be though) */
|
if (entry->EndingLBA < entry->StartingLBA) /* Bogus? */
|
||||||
memcpy(&start, &entry->StartingLBA, sizeof(start));
|
|
||||||
memcpy(&end, &entry->EndingLBA, sizeof(end));
|
|
||||||
|
|
||||||
if (end < start) /* Bogus? */
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
*ret_hd = (HARDDRIVE_DEVICE_PATH) {
|
*ret_hd = (HARDDRIVE_DEVICE_PATH) {
|
||||||
@@ -151,8 +145,8 @@ static EFI_STATUS try_gpt(
|
|||||||
.SubType = MEDIA_HARDDRIVE_DP,
|
.SubType = MEDIA_HARDDRIVE_DP,
|
||||||
},
|
},
|
||||||
.PartitionNumber = i + 1,
|
.PartitionNumber = i + 1,
|
||||||
.PartitionStart = start,
|
.PartitionStart = entry->StartingLBA,
|
||||||
.PartitionSize = end - start + 1,
|
.PartitionSize = entry->EndingLBA - entry->StartingLBA + 1,
|
||||||
.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER,
|
.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER,
|
||||||
.SignatureType = SIGNATURE_TYPE_GUID,
|
.SignatureType = SIGNATURE_TYPE_GUID,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user