summaryrefslogtreecommitdiff
path: root/pkg/util-linux/patch/0004-Remove-need-for-VLA-for-label-name.patch
blob: d67e51458fd91c72dddee181470a63bec76f4571 (plain)
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