Kevin Wolf <kw...@redhat.com> writes: > Am 21.02.2014 um 21:22 hat Eric Blake geschrieben: >> On 02/21/2014 08:24 AM, Kevin Wolf wrote: >> > has_help_option() checks if any help option ('help' or '?') occurs >> > anywhere in an option string, so that things like 'cluster_size=4k,help' >> > are recognised. >> > >> > is_valid_option_list() ensures that the option list doesn't have options >> > with leading commas or trailing unescaped commas.
Care to explain why these are bad? I dimly remember Eric and you discussing it last week, but I sure won't next time I look at this code... >> > Signed-off-by: Kevin Wolf <kw...@redhat.com> >> > --- >> >> > + >> > + while (*p) { >> > + p = get_opt_value(buf, buflen, p); >> > + if (*p) { >> > + p++; >> > + } >> > + >> > + if (is_help_option(buf)) { >> > + result = true; >> > + goto out; >> >> If this were 'break;', >> >> > + } >> > + } >> > + >> > +out: >> >> then you wouldn't need this label. But that's cosmetic. >> >> > + free(buf); >> > + return result; >> > +} >> > + >> > +bool is_valid_option_list(const char *param) >> > +{ >> > + size_t buflen = strlen(param) + 1; >> > + char *buf = g_malloc0(buflen); >> > + const char *p = param; >> > + bool result = true; >> > + >> > + while (*p) { >> > + p = get_opt_value(buf, buflen, p); >> > + if (*p && !*++p) { >> > + result = false; >> > + goto out; >> > + } >> >> Rejects trailing commas. >> >> > + >> > + if (!*buf || *buf == ',') { >> >> Rejects empty options, but also rejects values beginning with a comma. >> But we have legacy users that accept implicitly named first options (see >> opts_do_parse()). For example, this is a valid command line (albeit one >> that prints a list of valid machines): >> >> qemu-kvm -machine ,,blah >> >> as shorthand for >> >> qemu-kvm -machine type=,,blah >> >> and where *buf would indeed be validly ','. > > Right, but I can't allow this without allowing '-o ,,' which breaks the > real use case. So the lesson is that you can concatenate option strings > and use implicit option names at the same time. Another wart on the freakishly complex QemuOpts.