From e6effcac61152880451da25142cf93931834ffa9 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 10 Jan 2019 12:17:19 +0100 Subject: fdisk: make partition types uses more robust * report failed partition type parsing * make sure partition types code (from user reply) for MBR is hex Reported-by: Jonny Grant Signed-off-by: Karel Zak --- disk-utils/fdisk.c | 11 ++++++++--- libfdisk/src/parttype.c | 6 +++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c index 89fec2629..3e8ebf4a3 100644 --- a/disk-utils/fdisk.c +++ b/disk-utils/fdisk.c @@ -493,8 +493,13 @@ static struct fdisk_parttype *ask_partition_type(struct fdisk_context *cxt, int if (buf[1] == '\0' && toupper(*buf) == 'L') list_partition_types(cxt); - else if (*buf) - return fdisk_label_parse_parttype(lb, buf); + else if (*buf) { + struct fdisk_parttype *t = fdisk_label_parse_parttype(lb, buf); + + if (!t) + fdisk_info(cxt, _("Failed to parse '%s' partition type."), buf); + return t; + } } while (1); return NULL; @@ -621,7 +626,7 @@ void change_partition_type(struct fdisk_context *cxt) break; } while (!t); - if (canceled == 0 && fdisk_set_partition_type(cxt, i, t) == 0) + if (canceled == 0 && t && fdisk_set_partition_type(cxt, i, t) == 0) fdisk_info(cxt, _("Changed type of partition '%s' to '%s'."), old, t ? fdisk_parttype_get_name(t) : _("Unknown")); diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c index 5b4be6c3a..110ef3ba7 100644 --- a/libfdisk/src/parttype.c +++ b/libfdisk/src/parttype.c @@ -313,9 +313,11 @@ struct fdisk_parttype *fdisk_label_parse_parttype( str, lb->name)); types = lb->parttypes; - if (types[0].typestr == NULL && isxdigit(*str)) { + if (types[0].typestr == NULL) { unsigned int code = 0; + DBG(LABEL, ul_debugobj(lb, " parsing hex")); + errno = 0; code = strtol(str, &end, 16); @@ -331,6 +333,8 @@ struct fdisk_parttype *fdisk_label_parse_parttype( } else { int i; + DBG(LABEL, ul_debugobj(lb, " parsing string")); + /* maybe specified by type string (e.g. UUID) */ ret = fdisk_label_get_parttype_from_string(lb, str); if (ret) -- cgit v1.2.3-55-g7522