summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2016-02-16 13:27:24 -0500
committerRich Felker <dalias@aerifal.cx>2016-02-16 13:27:24 -0500
commitef2b5e9f13a7f216d6d64aeccc6b33c1262faece (patch)
treec2a4cc48802e53ce387db8c6cd279c1250cadd98
parent10a17dfbad2c267d885817abc9c7589fc7ff630b (diff)
downloadmusl-ef2b5e9f13a7f216d6d64aeccc6b33c1262faece.tar.gz
fix unlikely corner cases in getopt's message printing
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.
-rw-r--r--src/misc/getopt.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/misc/getopt.c b/src/misc/getopt.c
index 92179830..8290aef7 100644
--- a/src/misc/getopt.c
+++ b/src/misc/getopt.c
@@ -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);
}