diff options
author | Eric Blake <ebb9@byu.net> | 2010-04-07 17:56:20 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2010-04-07 17:56:20 -0700 |
commit | 66b93be793af309fb78d54199aed2306650079d0 (patch) | |
tree | 0c305b683cbd023b9f1efb1b1c580afcc6b1a86a | |
parent | cf0b68196c837ad591f0e7fc0f8e8a0f690b847c (diff) | |
download | glibc-66b93be793af309fb78d54199aed2306650079d0.zip glibc-66b93be793af309fb78d54199aed2306650079d0.tar.gz glibc-66b93be793af309fb78d54199aed2306650079d0.tar.bz2 |
getopt mishandles optstring of "+:"
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | posix/getopt.c | 6 |
2 files changed, 8 insertions, 2 deletions
@@ -1,5 +1,9 @@ 2009-12-01 Eric Blake <ebb9@byu.net> + [BZ #11039] + * posix/getopt.c (_getopt_internal_r): Skip optional - or + before + checking lead byte of optstring for :. + [BZ #11040] * posix/getopt.c (_getopt_internal_r): Reject '-;' as short option, since it conflicts with "W;" optstring extension. diff --git a/posix/getopt.c b/posix/getopt.c index b778047..2746364 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -395,8 +395,6 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, int long_only, struct _getopt_data *d, int posixly_correct) { int print_errors = d->opterr; - if (optstring[0] == ':') - print_errors = 0; if (argc < 1) return -1; @@ -411,6 +409,10 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, posixly_correct); d->__initialized = 1; } + else if (optstring[0] == '-' || optstring[0] == '+') + optstring++; + if (optstring[0] == ':') + print_errors = 0; /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag |