Mercurial > hg > octave-lojdl > gnulib-hg
changeset 15359:be44fb90ec88
getopt-gnu: avoid crash in glibc getopt
Use of "W;" in an option string may be rare, but we might as well
avoid crashing on it.
* m4/getopt.m4 (gl_GETOPT_CHECK_HEADRS): Detect the problem.
* tests/test-getopt.h (test_getopt): Enhance test.
* tests/test-getopt_long.h (test_getopt_long): Likewise.
* doc/posix-functions/getopt.texi (getopt): Document it.
* doc/glibc-functions/getopt_long.texi (getopt_long): Likewise.
* doc/glibc-functions/getopt_long_only.texi (getopt_long_only):
Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
author | Eric Blake <eblake@redhat.com> |
---|---|
date | Thu, 07 Jul 2011 10:24:20 -0600 |
parents | 93a104b6dce4 |
children | 7c698ee3edd1 |
files | ChangeLog doc/glibc-functions/getopt_long.texi doc/glibc-functions/getopt_long_only.texi doc/posix-functions/getopt.texi m4/getopt.m4 tests/test-getopt.h tests/test-getopt_long.h |
diffstat | 7 files changed, 73 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2011-07-07 Eric Blake <eblake@redhat.com> + + getopt-gnu: avoid crash in glibc getopt + * m4/getopt.m4 (gl_GETOPT_CHECK_HEADRS): Detect the problem. + * tests/test-getopt.h (test_getopt): Enhance test. + * tests/test-getopt_long.h (test_getopt_long): Likewise. + * doc/posix-functions/getopt.texi (getopt): Document it. + * doc/glibc-functions/getopt_long.texi (getopt_long): Likewise. + * doc/glibc-functions/getopt_long_only.texi (getopt_long_only): + Likewise. + 2011-07-07 Ulrich Drepper <drepper@gmail.com> getopt: handle W; without long options in getopt [BZ #12922]
--- a/doc/glibc-functions/getopt_long.texi +++ b/doc/glibc-functions/getopt_long.texi @@ -37,6 +37,10 @@ @item This function is missing on some platforms: AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Interix 3.5. +@item +This function crashes if the option string includes @code{W;} but +there are no long options, on some platforms: +glibc 2.14. @end itemize Portability problems not fixed by Gnulib:
--- a/doc/glibc-functions/getopt_long_only.texi +++ b/doc/glibc-functions/getopt_long_only.texi @@ -38,6 +38,10 @@ This function is missing on some platforms: MacOS X 10.3, FreeBSD 5.2.1, NetBSD 5.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, mingw, Interix 3.5. +@item +This function crashes if the option string includes @code{W;} but +there are no long options, on some platforms: +glibc 2.14. @end itemize Portability problems not fixed by Gnulib:
--- a/doc/posix-functions/getopt.texi +++ b/doc/posix-functions/getopt.texi @@ -48,6 +48,10 @@ The function @code{getopt_long_only} is missing on some platforms: MacOS X 10.3, FreeBSD 5.2.1, NetBSD 5.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, mingw, Interix 3.5. +@item +This function crashes if the option string includes @code{W;} on some +platforms: +glibc 2.14. @end itemize Portability problems not fixed by Gnulib:
--- a/m4/getopt.m4 +++ b/m4/getopt.m4 @@ -1,4 +1,4 @@ -# getopt.m4 serial 35 +# getopt.m4 serial 36 dnl Copyright (C) 2002-2006, 2008-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -281,6 +281,13 @@ else if (getopt (3, argv, "+:a:b") != ':') result |= 64; } + /* This code dumps core on glibc 2.14. */ + { + char *argv[] = { "program", "-W", "dummy", NULL }; + optind = opterr = 1; + if (getopt (3, argv, "W;") != 'W') + result |= 128; + } return result; ]])], [gl_cv_func_getopt_gnu=yes],
--- a/tests/test-getopt.h +++ b/tests/test-getopt.h @@ -1365,5 +1365,28 @@ ASSERT (optind == 3); ASSERT (!output); } + + /* Check that 'W' does not dump core: + http://sourceware.org/bugzilla/show_bug.cgi?id=12922 + Technically, POSIX says the presence of ';' in the opt-string + gives unspecified behavior, so we only test this when GNU compliance + is desired. */ + for (start = OPTIND_MIN; start <= 1; start++) + { + int argc = 0; + const char *argv[10]; + int c; + int pos = ftell (stderr); + + argv[argc++] = "program"; + argv[argc++] = "-W"; + argv[argc++] = "dummy"; + argv[argc] = NULL; + optind = start; + opterr = 1; + ASSERT (getopt (argc, (char **) argv, "W;") == 'W'); + ASSERT (ftell (stderr) == pos); + ASSERT (optind == 2); + } #endif /* GNULIB_TEST_GETOPT_GNU */ }
--- a/tests/test-getopt_long.h +++ b/tests/test-getopt_long.h @@ -314,6 +314,25 @@ } } + /* Test that 'W' does not dump core: + http://sourceware.org/bugzilla/show_bug.cgi?id=12922 */ + { + int argc = 0; + const char *argv[10]; + int option_index; + int c; + + argv[argc++] = "program"; + argv[argc++] = "-W"; + argv[argc++] = "dummy"; + argv[argc] = NULL; + optind = 1; + opterr = 0; + c = do_getopt_long (argc, argv, "W;", NULL, &option_index); + ASSERT (c == 'W'); + ASSERT (optind == 2); + } + /* Test processing of boolean short options. */ for (start = 0; start <= 1; start++) {