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
|
From 1c563b2cc82ee2f7ec5daeba5747346250fcc2e2 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Tue, 18 Jun 2019 11:54:57 -0700
Subject: [PATCH] Remove need for VLA for label name
---
disk-utils/fdisk-list.c | 10 +++-------
libfdisk/src/label.c | 6 ++++--
libfdisk/src/libfdisk.h.in | 2 +-
3 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/disk-utils/fdisk-list.c b/disk-utils/fdisk-list.c
index 62aa2b3f5..dafab3ca4 100644
--- a/disk-utils/fdisk-list.c
+++ b/disk-utils/fdisk-list.c
@@ -469,19 +469,15 @@ void list_available_columns(FILE *out)
static int fieldname_to_id(const char *name, size_t namesz)
{
const struct fdisk_field *fl;
- char buf[namesz + 1];
assert(name);
assert(namesz);
assert(fields_label);
- memcpy(buf, name, namesz);
- buf[namesz] = '\0';
-
- fl = fdisk_label_get_field_by_name(fields_label, buf);
+ fl = fdisk_label_get_field_by_name(fields_label, name, namesz);
if (!fl) {
- warnx(_("%s unknown column: %s"),
- fdisk_label_get_name(fields_label), buf);
+ warnx(_("%s unknown column: %.*s"),
+ fdisk_label_get_name(fields_label), (int)namesz, name);
return -1;
}
return fdisk_field_get_id(fl);
diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
index 524a2bfb4..e0ec7da43 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -223,12 +223,14 @@ const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, in
* fdisk_label_get_field_by_name
* @lb: label
* @name: field name
+ * @len: field name length
*
* Returns: pointer to static instance of the field.
*/
const struct fdisk_field *fdisk_label_get_field_by_name(
const struct fdisk_label *lb,
- const char *name)
+ const char *name,
+ size_t len)
{
size_t i;
@@ -236,7 +238,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 && strncasecmp(lb->fields[i].name, name, len) == 0 && lb->fields[i].name[len] == '\0')
return &lb->fields[i];
}
diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
index 6f2e77d04..a0e7aa4b2 100644
--- a/libfdisk/src/libfdisk.h.in
+++ b/libfdisk/src/libfdisk.h.in
@@ -466,7 +466,7 @@ extern int fdisk_label_get_fields_ids_all(
extern const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, int id);
extern const struct fdisk_field *fdisk_label_get_field_by_name(
const struct fdisk_label *lb,
- const char *name);
+ const char *name, size_t len);
extern void fdisk_label_set_changed(struct fdisk_label *lb, int changed);
extern int fdisk_label_is_changed(const struct fdisk_label *lb);
--
2.31.1
|