about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2010-04-07 17:56:20 -0700
committerUlrich Drepper <drepper@redhat.com>2010-04-07 17:56:20 -0700
commit66b93be793af309fb78d54199aed2306650079d0 (patch)
tree0c305b683cbd023b9f1efb1b1c580afcc6b1a86a
parentcf0b68196c837ad591f0e7fc0f8e8a0f690b847c (diff)
downloadglibc-66b93be793af309fb78d54199aed2306650079d0.tar.gz
glibc-66b93be793af309fb78d54199aed2306650079d0.tar.xz
glibc-66b93be793af309fb78d54199aed2306650079d0.zip
getopt mishandles optstring of "+:"
-rw-r--r--ChangeLog4
-rw-r--r--posix/getopt.c6
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b9e162f726..bb85ba9d0f 100644
--- 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.
diff --git a/posix/getopt.c b/posix/getopt.c
index b778047cd9..2746364fc7 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