always set optarg in getopt_long
authorRich Felker <dalias@aerifal.cx>
Wed, 21 Jan 2015 18:16:15 +0000 (13:16 -0500)
committerRich Felker <dalias@aerifal.cx>
Wed, 21 Jan 2015 18:16:15 +0000 (13:16 -0500)
the standard getopt does not touch optarg unless processing an option
with an argument. however, programs using the GNU getopt API, which we
attempt to provide in getopt_long, expect optarg to be a null pointer
after processing an option without an argument.

before argument permutation support was added, such programs typically
detected its absence and used their own replacement getopt_long,
masking the discrepency in behavior.

src/misc/getopt_long.c

index ffbcd42370ab31d857f2e16e7eb0dc11fe975859..bee77f43c9acbca9a0dd7f0fa49eb4113af99e70 100644 (file)
@@ -51,7 +51,7 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con
 
 static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
 {
-
+       optarg = 0;
        if (longopts && argv[optind][0] == '-' &&
                ((longonly && argv[optind][1]) ||
                 (argv[optind][1] == '-' && argv[optind][2])))