summaryrefslogtreecommitdiff
path: root/repo/v4l-utils/fix_parse_next_subopt.patch
blob: d4df9d4a3ab1dab4c51389a4b399b5468750cdf4 (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
parse_next_subopt() relies on undefined behavior and only works with glibc's
implementation of getsubopt(). This fixes the issue.
--- a/utils/v4l2-ctl/v4l2-ctl-common.cpp	2021-11-08 11:23:39.079748359 +0100
+++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp	2021-11-08 11:39:49.328576794 +0100
@@ -956,15 +956,23 @@ static bool parse_subset(char *optarg)
 
 static bool parse_next_subopt(char **subs, char **value)
 {
-	static char *const subopts[] = {
-	    nullptr
-	};
-	int opt = getsubopt(subs, subopts, value);
+	char *start = *subs;
+	if (!start || (start[0] == '\0')) {
+		fprintf(stderr, "Missing suboption value\n");
+		return true;
+	}
+	*value = start;
 
-	if (opt < 0 || *value)
-		return false;
-	fprintf(stderr, "Missing suboption value\n");
-	return true;
+	char *sep = std::strchr(start, ',');
+	if (sep != nullptr) {
+		*sep = '\0';
+		*subs = sep + 1;
+	}
+	else {
+		*subs = std::strchr(start, '\0');
+	}
+
+	return false;
 }
 
 void common_cmd(const std::string &media_bus_info, int ch, char *optarg)