From: Karel Zak Date: Mon, 2 Sep 2024 12:21:40 +0000 (+0200) Subject: libfdisk: check alignment reset return codes X-Git-Tag: v2.42-start~219 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c9674e73a7fd96a19b45bb7756cc384dde846991;p=thirdparty%2Futil-linux.git libfdisk: check alignment reset return codes Traditionally, there was only recalculation based on disk properties. However, since libfdisk now supports additional script headers to modify the default alignment, we need to check return codes. This is because users can specify nonsensical values. If we ignore the return codes, the library will report the issue multiple times and return an error to the application when creating a new disk label. Old version: >>> Script header accepted. >>> Last LBA specified by script is out of range. Last LBA specified by script is out of range. Last LBA specified by script is out of range. Failed to apply script headers, disk label not created: Numerical result out of range Fixed version: >>> Script header accepted. >>> Last LBA specified by script is out of range. Failed to apply script headers, disk label not created: Numerical result out of range. Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/alignment.c b/libfdisk/src/alignment.c index 3ae721913..2c7a00486 100644 --- a/libfdisk/src/alignment.c +++ b/libfdisk/src/alignment.c @@ -227,6 +227,8 @@ int fdisk_override_geometry(struct fdisk_context *cxt, unsigned int heads, unsigned int sectors) { + int rc = 0; + if (!cxt) return -EINVAL; if (heads) @@ -239,14 +241,15 @@ int fdisk_override_geometry(struct fdisk_context *cxt, else recount_geometry(cxt); - fdisk_reset_alignment(cxt); + rc = fdisk_reset_alignment(cxt); - DBG(CXT, ul_debugobj(cxt, "override C/H/S: %u/%u/%u", + DBG(CXT, ul_debugobj(cxt, "override C/H/S: %u/%u/%u [rc=%d]", (unsigned) cxt->geom.cylinders, (unsigned) cxt->geom.heads, - (unsigned) cxt->geom.sectors)); + (unsigned) cxt->geom.sectors, + rc)); - return 0; + return rc; } /** @@ -365,6 +368,8 @@ int fdisk_has_user_device_geometry(struct fdisk_context *cxt) int fdisk_apply_user_device_properties(struct fdisk_context *cxt) { + int rc; + if (!cxt) return -EINVAL; @@ -395,7 +400,9 @@ int fdisk_apply_user_device_properties(struct fdisk_context *cxt) else if (cxt->user_geom.heads || cxt->user_geom.sectors) recount_geometry(cxt); - fdisk_reset_alignment(cxt); + rc = fdisk_reset_alignment(cxt); + if (rc) + return rc; if (cxt->user_grain) { unsigned long granularity = max(cxt->phy_sector_size, cxt->min_io_size); @@ -467,8 +474,7 @@ int fdisk_reset_device_properties(struct fdisk_context *cxt) if (rc) return rc; - fdisk_apply_user_device_properties(cxt); - return 0; + return fdisk_apply_user_device_properties(cxt); } /* diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 463a60f86..2bf9e2ecd 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -303,8 +303,7 @@ int __fdisk_switch_label(struct fdisk_context *cxt, struct fdisk_label *lb) cxt->label = lb; DBG(CXT, ul_debugobj(cxt, "--> switching context to %s!", lb->name)); - fdisk_apply_label_device_properties(cxt); - return 0; + return fdisk_apply_label_device_properties(cxt); } /** diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index 3e383286b..374246ce6 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -3185,8 +3185,11 @@ static int gpt_reset_alignment(struct fdisk_context *cxt) } else { /* estimate ranges for GPT */ uint64_t first, last; + int rc; - count_first_last_lba(cxt, &first, &last, NULL); + rc = count_first_last_lba(cxt, &first, &last, NULL); + if (rc) + return rc; if (cxt->first_lba < first) cxt->first_lba = first; if (cxt->last_lba > last) diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c index dc0ad9b04..3b6a61441 100644 --- a/libfdisk/src/label.c +++ b/libfdisk/src/label.c @@ -346,7 +346,7 @@ int fdisk_list_disklabel(struct fdisk_context *cxt) */ int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name) { - int haslabel = 0; + int haslabel = 0, rc; struct fdisk_label *lb; if (!cxt) @@ -375,13 +375,19 @@ int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name) if (!lb->op->create) return -ENOSYS; - __fdisk_switch_label(cxt, lb); + rc = __fdisk_switch_label(cxt, lb); + if (rc) + return rc; + assert(cxt->label == lb); - if (haslabel && !cxt->parent) - fdisk_reset_device_properties(cxt); + if (haslabel && !cxt->parent) { + rc = fdisk_reset_device_properties(cxt); + if (rc) + return rc; + } - DBG(CXT, ul_debugobj(cxt, "create a new %s label", lb->name)); + DBG(CXT, ul_debugobj(cxt, "creating a new %s label", lb->name)); return lb->op->create(cxt); } diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index e357fad9a..913ae32eb 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -1570,8 +1570,12 @@ int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *d return rc; } - if (fdisk_has_user_device_properties(cxt)) - fdisk_apply_user_device_properties(cxt); + if (fdisk_has_user_device_properties(cxt)) { + rc = fdisk_apply_user_device_properties(cxt); + if (rc) + return rc; + } + /* create empty label */ name = fdisk_script_get_header(dp, "label");