summaryrefslogtreecommitdiffstats
path: root/external/poky/meta/recipes-core/util-linux/util-linux/0001-libfdisk-script-accept-sector-size-ignore-unknown-he.patch
blob: 911f70bc1f280f998872ab01f894474dfb6d2c9f (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
From 00e53f17c8462cb34ece08cc10db60a7da29a305 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 4 Feb 2020 15:11:19 +0100
Subject: [PATCH] libfdisk: (script) accept sector-size, ignore unknown headers

- add sector-size between supported headers (already in --dump output)

- report unknown headers by -ENOTSUP

- ignore ENOTSUP in sfdisk (but print warning) and in fdisk_script_read_file()

Upstream-Status: Backport [https://github.com/karelzak/util-linux/commit/00e53f17c8462cb34ece08cc10db60a7da29a305]

Addresses: https://github.com/karelzak/util-linux/issues/949
Signed-off-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Pierre-Jean Texier <pjtexier@koncepto.io>
---
 disk-utils/sfdisk.c   |  6 +++++-
 libfdisk/src/script.c | 49 ++++++++++++++++++++++++++-----------------------
 2 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c
index bb6e1c6..c0bea70 100644
--- a/disk-utils/sfdisk.c
+++ b/disk-utils/sfdisk.c
@@ -1782,7 +1782,11 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
 		}
 
 		rc = fdisk_script_read_line(dp, stdin, buf, sizeof(buf));
-		if (rc < 0) {
+		if (rc == -ENOTSUP) {
+			buf[sizeof(buf) - 1] = '\0';
+			fdisk_warnx(sf->cxt, _("Unknown script header '%s' -- ignore."), buf);
+			continue;
+		} else if (rc < 0) {
 			DBG(PARSE, ul_debug("script parsing failed, trying sfdisk specific commands"));
 			buf[sizeof(buf) - 1] = '\0';
 			rc = loop_control_commands(sf, dp, buf);
diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c
index a21771b..d3e67fa 100644
--- a/libfdisk/src/script.c
+++ b/libfdisk/src/script.c
@@ -805,8 +805,12 @@ static inline int is_header_line(const char *s)
 /* parses "<name>: value", note modifies @s*/
 static int parse_line_header(struct fdisk_script *dp, char *s)
 {
-	int rc = -EINVAL;
+	size_t i;
 	char *name, *value;
+	static const char *supported[] = {
+		"label", "unit", "label-id", "device", "grain",
+		"first-lba", "last-lba", "table-length", "sector-size"
+	};
 
 	DBG(SCRIPT, ul_debugobj(dp, "   parse header '%s'", s));
 
@@ -816,7 +820,7 @@ static int parse_line_header(struct fdisk_script *dp, char *s)
 	name = s;
 	value = strchr(s, ':');
 	if (!value)
-		goto done;
+		return -EINVAL;
 	*value = '\0';
 	value++;
 
@@ -825,32 +829,30 @@ static int parse_line_header(struct fdisk_script *dp, char *s)
 	ltrim_whitespace((unsigned char *) value);
 	rtrim_whitespace((unsigned char *) value);
 
+	if (!*name || !*value)
+		return -EINVAL;
+
+	/* check header name */
+	for (i = 0; i < ARRAY_SIZE(supported); i++) {
+		if (strcmp(name, supported[i]) == 0)
+			break;
+	}
+	if (i == ARRAY_SIZE(supported))
+		return -ENOTSUP;
+
+	/* header specific actions */
 	if (strcmp(name, "label") == 0) {
 		if (dp->cxt && !fdisk_get_label(dp->cxt, value))
-			goto done;			/* unknown label name */
+			return -EINVAL;			/* unknown label name */
 		dp->force_label = 1;
+
 	} else if (strcmp(name, "unit") == 0) {
 		if (strcmp(value, "sectors") != 0)
-			goto done;			/* only "sectors" supported */
-	} else if (strcmp(name, "label-id") == 0
-		   || strcmp(name, "device") == 0
-		   || strcmp(name, "grain") == 0
-		   || strcmp(name, "first-lba") == 0
-		   || strcmp(name, "last-lba") == 0
-		   || strcmp(name, "table-length") == 0) {
-		;					/* whatever is possible */
-	} else
-		goto done;				/* unknown header */
+			return -EINVAL;			/* only "sectors" supported */
 
-	if (*name && *value)
-		rc = fdisk_script_set_header(dp, name, value);
-done:
-	if (rc)
-		DBG(SCRIPT, ul_debugobj(dp, "header parse error: "
-				"[rc=%d, name='%s', value='%s']",
-				rc, name, value));
-	return rc;
+	}
 
+	return fdisk_script_set_header(dp, name, value);
 }
 
 /* returns zero terminated string with next token and @str is updated */
@@ -1363,7 +1365,8 @@ int fdisk_script_set_fgets(struct fdisk_script *dp,
  *
  * Reads next line into dump.
  *
- * Returns: 0 on success, <0 on error, 1 when nothing to read.
+ * Returns: 0 on success, <0 on error, 1 when nothing to read. For unknown headers
+ *          returns -ENOTSUP, it's usually safe to ignore this error.
  */
 int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t bufsz)
 {
@@ -1428,7 +1431,7 @@ int fdisk_script_read_file(struct fdisk_script *dp, FILE *f)
 
 	while (!feof(f)) {
 		rc = fdisk_script_read_line(dp, f, buf, sizeof(buf));
-		if (rc)
+		if (rc && rc != -ENOTSUP)
 			break;
 	}
 
-- 
2.7.4