From: Jamie Magee Date: Mon, 4 May 2026 15:47:59 +0000 (-0700) Subject: libfdisk: gpt: use ul_strtou16 for attribute bit parsing X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dce82b3b7ab5e29133bd0bb41ba2f5d04235648;p=thirdparty%2Futil-linux.git libfdisk: gpt: use ul_strtou16 for attribute bit parsing Replace bare strtol() with ul_strtou16() which folds the errno/end-pointer/empty-input checks into one call and uses a uint16_t result type matching the bit-index domain. Also add udevadm settle between write/read sfdisk calls in the new attribute subtests. --- diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index 1c98d859e..2511361f6 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -1851,24 +1851,40 @@ static int gpt_entry_attrs_from_string( } else if (isdigit((unsigned char) *p) || (strncmp(p, "GUID:", 5) == 0 && isdigit((unsigned char) *(p + 5)))) { - char *end = NULL; + const char *num_start, *num_end; + char buf[32]; + size_t len; + uint16_t val; int is_guid = (*p == 'G'); if (is_guid) p += 5; - errno = 0; - bit = strtol(p, &end, 0); - if (errno || !end || end == p) - bit = -1; - else if (bit >= GPT_ATTRBIT_GUID_FIRST - && bit < GPT_ATTRBIT_GUID_FIRST + GPT_ATTRBIT_GUID_COUNT) - p = end; - else if (!is_guid && bit >= GPT_ATTRBIT_REQ - && bit <= GPT_ATTRBIT_LEGACY) - p = end; - else + num_start = p; + num_end = p; + while (*num_end && *num_end != ',' && !isblank(*num_end)) + num_end++; + len = num_end - num_start; + + if (len == 0 || len >= sizeof(buf)) { bit = -1; + } else { + memcpy(buf, num_start, len); + buf[len] = '\0'; + + if (ul_strtou16(buf, &val, 0) != 0) + bit = -1; + else if (val >= GPT_ATTRBIT_GUID_FIRST + && val < GPT_ATTRBIT_GUID_FIRST + GPT_ATTRBIT_GUID_COUNT) { + bit = val; + p = num_end; + } else if (!is_guid && val >= GPT_ATTRBIT_REQ + && val <= GPT_ATTRBIT_LEGACY) { + bit = val; + p = num_end; + } else + bit = -1; + } } if (bit < 0) { diff --git a/tests/ts/sfdisk/gpt b/tests/ts/sfdisk/gpt index 10290485b..80659c2ef 100755 --- a/tests/ts/sfdisk/gpt +++ b/tests/ts/sfdisk/gpt @@ -132,6 +132,7 @@ ts_finalize_subtest ts_init_subtest "attrs-numeric-named" $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 "0,1,2" >> $TS_OUTPUT 2>> $TS_ERRLOG +udevadm settle $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 >> $TS_OUTPUT 2>> $TS_ERRLOG ts_fdisk_clean $TS_DEVICE udevadm settle @@ -140,6 +141,7 @@ ts_finalize_subtest ts_init_subtest "attrs-numeric-mixed" $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 "2,GUID:60" >> $TS_OUTPUT 2>> $TS_ERRLOG +udevadm settle $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 >> $TS_OUTPUT 2>> $TS_ERRLOG ts_fdisk_clean $TS_DEVICE udevadm settle @@ -148,6 +150,7 @@ ts_finalize_subtest ts_init_subtest "attrs-numeric-hex" $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 "0x2" >> $TS_OUTPUT 2>> $TS_ERRLOG +udevadm settle $TS_CMD_SFDISK --part-attrs ${TS_DEVICE} 2 >> $TS_OUTPUT 2>> $TS_ERRLOG ts_fdisk_clean $TS_DEVICE udevadm settle