1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
From: Karel Zak <kzak@redhat.com>
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 <kzak@redhat.com>
(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 <blkid.h>
#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);
|