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)