summaryrefslogtreecommitdiff
path: root/disk/part_efi.c
diff options
context:
space:
mode:
Diffstat (limited to 'disk/part_efi.c')
-rw-r--r--disk/part_efi.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 807d01de39..2973d52f6a 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -445,24 +445,38 @@ int gpt_fill_pte(struct blk_desc *dev_desc,
char *str_type_guid;
unsigned char *bin_type_guid;
#endif
+ size_t hdr_start = gpt_h->my_lba;
+ size_t hdr_end = hdr_start + 1;
+
+ size_t pte_start = gpt_h->partition_entry_lba;
+ size_t pte_end = pte_start +
+ gpt_h->num_partition_entries * gpt_h->sizeof_partition_entry /
+ dev_desc->blksz;
for (i = 0; i < parts; i++) {
/* partition starting lba */
lbaint_t start = partitions[i].start;
lbaint_t size = partitions[i].size;
- if (start && (start < offset)) {
- printf("Partition overlap\n");
- return -1;
- }
-
if (start) {
- gpt_e[i].starting_lba = cpu_to_le64(start);
offset = start + size;
} else {
- gpt_e[i].starting_lba = cpu_to_le64(offset);
+ start = offset;
offset += size;
}
+
+ /*
+ * If our partition overlaps with either the GPT
+ * header, or the partition entry, reject it.
+ */
+ if (((start <= hdr_end && hdr_start <= (start + size)) ||
+ (start <= pte_end && pte_start <= (start + size)))) {
+ printf("Partition overlap\n");
+ return -1;
+ }
+
+ gpt_e[i].starting_lba = cpu_to_le64(start);
+
if (offset > (last_usable_lba + 1)) {
printf("Partitions layout exceds disk size\n");
return -1;