From: Karel Zak Date: Wed, 30 Sep 2020 09:44:03 +0000 (+0200) Subject: libfdisk: (gpt) make sure device is large enough X-Git-Tag: v2.37-rc1~458 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ffac9652c737b97069732a6a2b1eae8d3db40d57;p=thirdparty%2Futil-linux.git 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 --- 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)