From: Karel Zak Date: Tue, 1 Apr 2025 17:45:01 +0200 Subject: lsblk: avoid strcasecmp() for ASCII-only strings Use cctype.h for locale-independent string comparison and to avoid tricky string conversions like in tr_TR locales. Fixes: https://github.com/util-linux/util-linux/issues/3490 Signed-off-by: Karel Zak (cherry picked from commit b5ae9e8d0234738f381c56aa797aeba81a05d587) --- misc-utils/lsblk-properties.c | 11 ++++++----- misc-utils/lsblk.c | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/misc-utils/lsblk-properties.c b/misc-utils/lsblk-properties.c index 66a6df6..21e764b 100644 --- a/misc-utils/lsblk-properties.c +++ b/misc-utils/lsblk-properties.c @@ -6,6 +6,7 @@ #endif #include "c.h" +#include "cctype.h" #include "xalloc.h" #include "mangle.h" #include "path.h" @@ -352,13 +353,13 @@ done: static int name2method(const char *name, size_t namesz) { - if (namesz == 4 && strncasecmp(name, "none", namesz) == 0) + if (namesz == 4 && c_strncasecmp(name, "none", namesz) == 0) return LSBLK_METHOD_NONE; - if (namesz == 4 && strncasecmp(name, "udev", namesz) == 0) + if (namesz == 4 && c_strncasecmp(name, "udev", namesz) == 0) return LSBLK_METHOD_UDEV; - if (namesz == 5 && strncasecmp(name, "blkid", namesz) == 0) + if (namesz == 5 && c_strncasecmp(name, "blkid", namesz) == 0) return LSBLK_METHOD_BLKID; - if (namesz == 4 && strncasecmp(name, "file", namesz) == 0) + if (namesz == 4 && c_strncasecmp(name, "file", namesz) == 0) return LSBLK_METHOD_FILE; warnx(_("unknown properties probing method: %s"), name); @@ -472,7 +473,7 @@ const char *lsblk_parttype_code_to_string(const char *code, const char *pttype) const struct lsblk_parttype *t = &gpt_types[i]; if (t->name && t->typestr && - strcasecmp(code, t->typestr) == 0) + c_strcasecmp(code, t->typestr) == 0) return t->name; } } diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index 6a8dc50..bd2621c 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -40,6 +40,7 @@ #include #include "c.h" +#include "cctype.h" #include "pathnames.h" #include "blkdev.h" #include "canonicalize.h" @@ -350,7 +351,7 @@ static int column_name_to_id(const char *name, size_t namesz) for (i = 0; i < ARRAY_SIZE(infos); i++) { const char *cn = infos[i].name; - if (!strncasecmp(name, cn, namesz) && !*(cn + namesz)) + if (!c_strncasecmp(name, cn, namesz) && !*(cn + namesz)) return i; } @@ -362,7 +363,7 @@ static int column_name_to_id(const char *name, size_t namesz) for (i = 0; i < ARRAY_SIZE(infos); i++) { if (scols_shellvar_name(infos[i].name, &buf, &bufsz) != 0) continue; - if (!strncasecmp(name, buf, namesz) && !*(buf + namesz)) { + if (!c_strncasecmp(name, buf, namesz) && !*(buf + namesz)) { free(buf); return i; } @@ -463,7 +464,7 @@ static char *get_type(struct lsblk_device *dev) if (dm_uuid_prefix) { /* kpartx hack to remove partition number */ - if (strncasecmp(dm_uuid_prefix, "part", 4) == 0) + if (c_strncasecmp(dm_uuid_prefix, "part", 4) == 0) dm_uuid_prefix[4] = '\0'; res = xstrdup(dm_uuid_prefix);