getopt: fix optional argument processing
authorFelix Fietkau <nbd@openwrt.org>
Tue, 21 Oct 2014 20:24:50 +0000 (22:24 +0200)
committerRich Felker <dalias@aerifal.cx>
Sun, 16 Nov 2014 04:44:53 +0000 (23:44 -0500)
Processing an option character with optional argument fails if the
option is last on the command line. This happens because the
if (optind >= argc) check runs first before testing for optional
argument.

src/misc/getopt.c

index 8a2e4d50d891e63281411b997e57822745e9bb79..f94c4f70a97c10cf853f7bc8b4c6eb600b9bab36 100644 (file)
@@ -55,7 +55,8 @@ int getopt(int argc, char * const argv[], const char *optstring)
                return '?';
        }
        if (optstring[i+1] == ':') {
-               if (optind >= argc) {
+               if (optstring[i+2] == ':') optarg = 0;
+               else if (optind >= argc) {
                        if (optstring[0] == ':') return ':';
                        if (opterr) {
                                write(2, argv[0], strlen(argv[0]));
@@ -65,7 +66,6 @@ int getopt(int argc, char * const argv[], const char *optstring)
                        }
                        return '?';
                }
-               if (optstring[i+2] == ':') optarg = 0;
                if (optstring[i+2] != ':' || optpos) {
                        optarg = argv[optind++] + optpos;
                        optpos = 0;