fix unlikely corner cases in getopt's message printing
authorRich Felker <dalias@aerifal.cx>
Tue, 16 Feb 2016 18:27:24 +0000 (13:27 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 16 Feb 2016 18:27:24 +0000 (13:27 -0500)
like fputs (see commit 10a17dfbad2c267d885817abc9c7589fc7ff630b), the
message printing code for getopt assumed that fwrite only returns 0 on
failure, but it can also happen on success if the total length to be
written is zero. programs with zero-length argv[0] were affected.

commit 500c6886c654fd45e4926990fee2c61d816be197 introduced this
problem in getopt by fixing the fwrite behavior to conform to the
requirements of ISO C. previously the wrong expectations of the getopt
code were met by the fwrite implementation.

src/misc/getopt.c

index 921798303f747ca8edf6b13cfc1508c9f5191242..8290aef75aa43541c0bfed0ed8757265e65dbc07 100644 (file)
@@ -17,9 +17,9 @@ void __getopt_msg(const char *a, const char *b, const char *c, size_t l)
        FILE *f = stderr;
        b = __lctrans_cur(b);
        flockfile(f);
-       fwrite(a, strlen(a), 1, f)
+       fputs(a, f)>=0
        && fwrite(b, strlen(b), 1, f)
-       && fwrite(c, l, 1, f)
+       && fwrite(c, 1, l, f)==l
        && putc('\n', f);
        funlockfile(f);
 }