Several GPT header fields are read without converting from little-endian, which is wrong on big-endian hosts.
gpt_fill_pte() takes my_lba and partition_entry_lba raw when working out the region a partition must not overlap, so on a big-endian host both bounds are byte-swapped garbage and the overlap check does not do anything useful. gpt_verify_partitions() compares the loop counter against num_partition_entries raw, so its "More partitions than allowed!" guard never triggers. It also swaps gpt_part_size, which is already in host order, having been computed from two le64_to_cpu() results a few lines above. Drop the conversion rather than adding one. All of this is a no-op on little-endian targets. Signed-off-by: Alexey Charkov <[email protected]> --- disk/part_efi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/disk/part_efi.c b/disk/part_efi.c index af311867a285..062389c3af0c 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -462,10 +462,10 @@ int gpt_fill_pte(struct blk_desc *desc, char *str_type_guid; unsigned char *bin_type_guid; #endif - size_t hdr_start = gpt_h->my_lba; + size_t hdr_start = le64_to_cpu(gpt_h->my_lba); size_t hdr_end = hdr_start + 1; - size_t pte_start = gpt_h->partition_entry_lba; + size_t pte_start = le64_to_cpu(gpt_h->partition_entry_lba); size_t pte_end = pte_start + gpt_pte_blocks(desc, gpt_h); for (i = 0; i < parts; i++) { @@ -851,7 +851,7 @@ int gpt_verify_partitions(struct blk_desc *desc, gpt_e = *gpt_pte; for (i = 0; i < parts; i++) { - if (i == gpt_head->num_partition_entries) { + if (i == le32_to_cpu(gpt_head->num_partition_entries)) { pr_err("More partitions than allowed!\n"); return -1; } @@ -877,7 +877,7 @@ int gpt_verify_partitions(struct blk_desc *desc, (unsigned long long)gpt_part_size, (unsigned long long)partitions[i].size); - if (le64_to_cpu(gpt_part_size) != partitions[i].size) { + if (gpt_part_size != partitions[i].size) { /* We do not check the extend partition size */ if ((i == parts - 1) && (partitions[i].size == 0)) continue; -- 2.54.0
