diff options
| author | Karel Zak <kzak@redhat.com> | 2020-09-30 11:44:03 +0200 |
|---|---|---|
| committer | Karel Zak <kzak@redhat.com> | 2020-09-30 11:44:03 +0200 |
| commit | ffac9652c737b97069732a6a2b1eae8d3db40d57 (patch) | |
| tree | b6008f2ce794335f52d51d3d9afd3aeba83e7512 | |
| parent | e9131920485962f33bd32b492cb93078ee7a3c34 (diff) | |
| download | util-linux-ffac9652c737b97069732a6a2b1eae8d3db40d57.tar.gz | |
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 <kzak@redhat.com>
| -rw-r--r-- | libfdisk/src/gpt.c | 21 |
1 files 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) |
