diff options
author | davidovski <david@davidovski.xyz> | 2022-05-01 21:21:05 +0000 |
---|---|---|
committer | davidovski <david@davidovski.xyz> | 2022-05-01 21:21:05 +0000 |
commit | 606bc59d0f8f67815c6a717843835477d44db6b3 (patch) | |
tree | 687b3fe5bc844b90a3841e1ea543aa9f9934a93a /extra/v4l-utils/fix_parse_next_subopt.patch | |
parent | 1084afc3c4d9c83e61620de60ba59a4393a33cb0 (diff) |
added ungoogled chromium
Diffstat (limited to 'extra/v4l-utils/fix_parse_next_subopt.patch')
-rw-r--r-- | extra/v4l-utils/fix_parse_next_subopt.patch | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/extra/v4l-utils/fix_parse_next_subopt.patch b/extra/v4l-utils/fix_parse_next_subopt.patch new file mode 100644 index 0000000..d4df9d4 --- /dev/null +++ b/extra/v4l-utils/fix_parse_next_subopt.patch @@ -0,0 +1,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) |