1
0
Fork 0
util-linux/debian/patches/upstream-stable/libfdisk-avoid-strcasecmp-for-ASCII-only-strings.patch
Daniel Baumann 070ab789ab
Adding debian version 2.41-5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 11:26:36 +02:00

166 lines
5 KiB
Diff

From: Karel Zak <kzak@redhat.com>
Date: Tue, 1 Apr 2025 17:45:01 +0200
Subject: libfdisk: 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.
Signed-off-by: Karel Zak <kzak@redhat.com>
(cherry picked from commit 8ec0c305e9f6ab904119201a13873faedb30da57)
---
libfdisk/src/context.c | 9 +++++----
libfdisk/src/label.c | 3 ++-
libfdisk/src/parttype.c | 3 ++-
libfdisk/src/script.c | 21 +++++++++++----------
4 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index 2bf9e2e..3b2a4d2 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -2,6 +2,7 @@
# include <blkid.h>
#endif
+#include "cctype.h"
#include "blkdev.h"
#ifdef __linux__
# include "partx.h"
@@ -168,9 +169,9 @@ struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent,
}
if (name) {
- if (strcasecmp(name, "bsd") == 0)
+ if (c_strcasecmp(name, "bsd") == 0)
lb = cxt->labels[ cxt->nlabels++ ] = fdisk_new_bsd_label(cxt);
- else if (strcasecmp(name, "dos") == 0 || strcasecmp(name, "mbr") == 0)
+ else if (c_strcasecmp(name, "dos") == 0 || c_strcasecmp(name, "mbr") == 0)
lb = cxt->labels[ cxt->nlabels++ ] = fdisk_new_dos_label(cxt);
}
@@ -227,12 +228,12 @@ struct fdisk_label *fdisk_get_label(struct fdisk_context *cxt, const char *name)
if (!name)
return cxt->label;
- if (strcasecmp(name, "mbr") == 0)
+ if (c_strcasecmp(name, "mbr") == 0)
name = "dos";
for (i = 0; i < cxt->nlabels; i++)
if (cxt->labels[i]
- && strcasecmp(cxt->labels[i]->name, name) == 0)
+ && c_strcasecmp(cxt->labels[i]->name, name) == 0)
return cxt->labels[i];
DBG(CXT, ul_debugobj(cxt, "failed to found %s label driver", name));
diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
index 3b6a614..04afe8d 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -1,5 +1,6 @@
#include "fdiskP.h"
+#include "cctype.h"
/**
@@ -236,7 +237,7 @@ const struct fdisk_field *fdisk_label_get_field_by_name(
assert(name);
for (i = 0; i < lb->nfields; i++) {
- if (lb->fields[i].name && strcasecmp(lb->fields[i].name, name) == 0)
+ if (lb->fields[i].name && c_strcasecmp(lb->fields[i].name, name) == 0)
return &lb->fields[i];
}
diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c
index 8566932..8e36ada 100644
--- a/libfdisk/src/parttype.c
+++ b/libfdisk/src/parttype.c
@@ -2,6 +2,7 @@
#include <ctype.h>
#include "fdiskP.h"
+#include "cctype.h"
#include "strutils.h"
/**
@@ -264,7 +265,7 @@ struct fdisk_parttype *fdisk_label_get_parttype_from_string(
for (i = 0; i < lb->nparttypes; i++)
if (lb->parttypes[i].typestr
- && strcasecmp(lb->parttypes[i].typestr, str) == 0)
+ && c_strcasecmp(lb->parttypes[i].typestr, str) == 0)
return (struct fdisk_parttype *)&lb->parttypes[i];
return NULL;
diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c
index 652b14e..6bb642f 100644
--- a/libfdisk/src/script.c
+++ b/libfdisk/src/script.c
@@ -1,4 +1,5 @@
+#include "cctype.h"
#include "fdiskP.h"
#include "strutils.h"
#include "carefulputc.h"
@@ -239,7 +240,7 @@ static struct fdisk_scriptheader *script_get_header(struct fdisk_script *dp,
list_for_each(p, &dp->headers) {
struct fdisk_scriptheader *fi = list_entry(p, struct fdisk_scriptheader, headers);
- if (strcasecmp(fi->name, name) == 0)
+ if (c_strcasecmp(fi->name, name) == 0)
return fi;
}
@@ -1165,41 +1166,41 @@ static int parse_line_nameval(struct fdisk_script *dp, char *s)
DBG(SCRIPT, ul_debugobj(dp, " parsing '%s'", p));
p = (char *) skip_blank(p);
- if (!strncasecmp(p, "start=", 6)) {
+ if (!c_strncasecmp(p, "start=", 6)) {
p += 6;
rc = parse_start_value(dp, pa, &p);
- } else if (!strncasecmp(p, "size=", 5)) {
+ } else if (!c_strncasecmp(p, "size=", 5)) {
p += 5;
rc = parse_size_value(dp, pa, &p);
- } else if (!strncasecmp(p, "bootable", 8)) {
+ } else if (!c_strncasecmp(p, "bootable", 8)) {
/* we use next_token() to skip possible extra space */
char *tk = next_token(&p);
- if (tk && strcasecmp(tk, "bootable") == 0)
+ if (tk && c_strcasecmp(tk, "bootable") == 0)
pa->boot = 1;
else
rc = -EINVAL;
- } else if (!strncasecmp(p, "attrs=", 6)) {
+ } else if (!c_strncasecmp(p, "attrs=", 6)) {
p += 6;
free(pa->attrs);
rc = next_string(&p, &pa->attrs);
- } else if (!strncasecmp(p, "uuid=", 5)) {
+ } else if (!c_strncasecmp(p, "uuid=", 5)) {
p += 5;
free(pa->uuid);
rc = next_string(&p, &pa->uuid);
- } else if (!strncasecmp(p, "name=", 5)) {
+ } else if (!c_strncasecmp(p, "name=", 5)) {
p += 5;
free(pa->name);
rc = next_string(&p, &pa->name);
if (!rc)
unhexmangle_string(pa->name);
- } else if (!strncasecmp(p, "type=", 5) ||
- !strncasecmp(p, "Id=", 3)) { /* backward compatibility */
+ } else if (!c_strncasecmp(p, "type=", 5) ||
+ !c_strncasecmp(p, "Id=", 3)) { /* backward compatibility */
char *type = NULL;
fdisk_unref_parttype(pa->type);