aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2020-09-30 11:44:03 +0200
committerKarel Zak <kzak@redhat.com>2020-09-30 11:44:03 +0200
commitffac9652c737b97069732a6a2b1eae8d3db40d57 (patch)
treeb6008f2ce794335f52d51d3d9afd3aeba83e7512
parente9131920485962f33bd32b492cb93078ee7a3c34 (diff)
downloadutil-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.c21
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)