getopt mishandles optstring of "+:"
authorEric Blake <ebb9@byu.net>
Thu, 8 Apr 2010 00:56:20 +0000 (17:56 -0700)
committerUlrich Drepper <drepper@redhat.com>
Thu, 8 Apr 2010 00:56:20 +0000 (17:56 -0700)
ChangeLog
posix/getopt.c

index b9e162f..bb85ba9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index b778047..2746364 100644 (file)
@@ -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