From ffac9652c737b97069732a6a2b1eae8d3db40d57 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 30 Sep 2020 11:44:03 +0200 Subject: [PATCH] libfdisk: (gpt) make sure device is large enough The current code creates GPT header and partitions arrays (with 128 entries ...) although there is no space for all the stuff. This patch forces fdisk_create_disklabel() to return -ENOSPC if the last and first usable LBA calculation is out of device size. Addresses: https://github.com/karelzak/util-linux/issues/1147 Signed-off-by: Karel Zak --- libfdisk/src/gpt.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index 66520c51db..563c77073b 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -417,9 +417,13 @@ static inline int gpt_calculate_alternative_entries_lba( uint64_t esects = 0; int rc = gpt_calculate_sectorsof_entries(hdr, nents, &esects, cxt); - if (rc == 0) - *sz = cxt->total_sectors - 1ULL - esects; - return rc; + if (rc) + return rc; + if (cxt->total_sectors < 1ULL + esects) + return -ENOSPC; + + *sz = cxt->total_sectors - 1ULL - esects; + return 0; } static inline int gpt_calculate_last_lba( @@ -431,9 +435,13 @@ static inline int gpt_calculate_last_lba( uint64_t esects = 0; int rc = gpt_calculate_sectorsof_entries(hdr, nents, &esects, cxt); - if (rc == 0) - *sz = cxt->total_sectors - 2ULL - esects; - return rc; + if (rc) + return rc; + if (cxt->total_sectors < 2ULL + esects) + return -ENOSPC; + + *sz = cxt->total_sectors - 2ULL - esects; + return 0; } static inline int gpt_calculate_first_lba( @@ -3082,7 +3090,6 @@ static int gpt_reset_alignment(struct fdisk_context *cxt) uint64_t first, last; count_first_last_lba(cxt, &first, &last); - if (cxt->first_lba < first) cxt->first_lba = first; if (cxt->last_lba > last) -- 2.47.3