|
Message-ID: <20180426201713.GS4418@port70.net> Date: Thu, 26 Apr 2018 22:17:13 +0200 From: Szabolcs Nagy <nsz@...t70.net> To: musl@...ts.openwall.com Subject: Re: getopt_long_only bug * Rich Felker <dalias@...c.org> [2018-04-26 10:50:37 -0400]: > OK, this is a weird corner case. Apparently when in longonly mode, > short options need to be counted in addition to long ones for > determining if a partial match is unique. > > The attached patch should solve the problem. Any review/comments would > be helpful. It uses an ugly inline strstr of sorts, because to use > strstr we'd need to copy to a temp buffer, and we wouldn't even > benefit since the string being searched is so short (usually 1 byte, > at most 4). The only reason it's there at all is because we committed > to supporting multibyte option chars in getopt.c so getopt_long_only > needs to handle them consistently. looks ok to me. > diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c > index 008b747..ddcef94 100644 > --- a/src/misc/getopt_long.c > +++ b/src/misc/getopt_long.c > @@ -1,5 +1,7 @@ > #define _GNU_SOURCE > #include <stddef.h> > +#include <stdlib.h> > +#include <limits.h> > #include <getopt.h> > #include <stdio.h> > #include <string.h> > @@ -58,10 +60,10 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring > { > int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':'; > int i, cnt, match; > - char *arg, *opt; > + char *arg, *opt, *start = argv[optind]+1; > for (cnt=i=0; longopts[i].name; i++) { > const char *name = longopts[i].name; > - opt = argv[optind]+1; > + opt = start; > if (*opt == '-') opt++; > while (*opt && *opt != '=' && *opt == *name) > name++, opt++; > @@ -74,6 +76,17 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring > } > cnt++; > } > + if (cnt==1 && longonly && arg-start == mblen(start, MB_LEN_MAX)) { > + int l = arg-start; > + for (i=0; optstring[i]; i++) { > + int j; > + for (j=0; j<l && start[j]==optstring[i+j]; j++); > + if (j==l) { > + cnt++; > + break; > + } > + } > + } > if (cnt==1) { > i = match; > opt = arg;
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.