On Tue, 19 Aug 2014 18:13:09 -0700 Bill Spitzak <spit...@gmail.com> wrote:
> Fail on trailing text after numbers, such as --width=100mm > > Fail on any text after booleans, such as --flag=false > > Also fixed reading of memory after the null terminator of a long > option with no = sign in it. > --- > shared/option-parser.c | 89 > +++++++++++++++++++++++++++++++++--------------- > 1 file changed, 61 insertions(+), 28 deletions(-) > > diff --git a/shared/option-parser.c b/shared/option-parser.c > index c00349a..b8e7394 100644 > --- a/shared/option-parser.c > +++ b/shared/option-parser.c > @@ -30,53 +30,86 @@ > > #include "config-parser.h" > > -static void > +static int > handle_option(const struct weston_option *option, char *value) > { > + char* p; > + > switch (option->type) { > case WESTON_OPTION_INTEGER: > - * (int32_t *) option->data = strtol(value, NULL, 0); > - return; > + * (int32_t *) option->data = strtol(value, &p, 0); > + return *value && !*p; > case WESTON_OPTION_UNSIGNED_INTEGER: > - * (uint32_t *) option->data = strtoul(value, NULL, 0); > - return; > + * (uint32_t *) option->data = strtoul(value, &p, 0); > + return *value && !*p; > case WESTON_OPTION_STRING: > * (char **) option->data = strdup(value); > - return; > - case WESTON_OPTION_BOOLEAN: > - * (int32_t *) option->data = 1; > - return; > + return 1; > default: > assert(0); > } > } > > +static int > +long_option(const struct weston_option *options, int count, char* arg) Fixed to 'char *arg'. > +{ > + int k, len; > + > + for (k = 0; k < count; k++) { > + if (!options[k].name) > + continue; > + len = strlen(options[k].name); > + if (strncmp(options[k].name, arg + 2, len) != 0) > + continue; > + if (options[k].type == WESTON_OPTION_BOOLEAN) { > + if (!arg[len + 2]) { > + * (int32_t *) options[k].data = 1; > + return 1; > + } > + } else if (arg[len+2] == '=') { > + return handle_option(options + k, arg + len + 3); > + } > + } > + return 0; > +} > + > +static int > +short_option(const struct weston_option *options, int count, char* arg) Fixed to 'char *arg'. > +{ > + int k; > + > + if (!arg[1]) > + return 0; > + for (k = 0; k < count; k++) { > + if (options[k].short_name != arg[1]) > + continue; > + if (options[k].type == WESTON_OPTION_BOOLEAN) { > + if (!arg[2]) { > + * (int32_t *) options[k].data = 1; > + return 1; > + } > + } else { > + return handle_option(options + k, arg + 2); > + } > + } > + return 0; > +} Added some empty lines to both functions above to make it more sectioned. > + > int > parse_options(const struct weston_option *options, > int count, int *argc, char *argv[]) > { > - int i, j, k, len = 0; > + int i, j; > > for (i = 1, j = 1; i < *argc; i++) { > - for (k = 0; k < count; k++) { > - if (options[k].name) > - len = strlen(options[k].name); > - if (options[k].name && > - argv[i][0] == '-' && > - argv[i][1] == '-' && > - strncmp(options[k].name, &argv[i][2], len) == 0 && > - (argv[i][len + 2] == '=' || argv[i][len + 2] == > '\0')) { > - handle_option(&options[k], &argv[i][len + 3]); > - break; > - } else if (options[k].short_name && > - argv[i][0] == '-' && > - options[k].short_name == argv[i][1]) { > - handle_option(&options[k], &argv[i][2]); > - break; > - } > + if (argv[i][0] == '-') { > + if (argv[i][1] == '-') { > + if (long_option(options, count, argv[i])) > + continue; > + } else if (short_option(options, count, argv[i])) > + continue; > } > - if (k == count) > - argv[j++] = argv[i]; > + argv[j++] = argv[i]; > } > argv[j] = NULL; > *argc = j; Looks correct, pushed. Thanks, pq _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel