This is a well-defined operation, so bwrite() should be able to
handle it. However, when running under glibc, fwrite() produces an
unexpected return value for 0-byte writes, which makes bwrite()
think that the write failed (causing a panic).
This change implements 0-byte writes by not calling into libc at
all, so that we don't have to worry about how to decode the return
value of fwrite().
int idx = getidx(fd, NOFLG);
if (idx >= 0) {
+ if (num == 0) {
+ /* nothing to do; we need a special case to exit early
+ because glibc fwrite doesn't give reliable
+ success/failure indication when writing 0 bytes */
+ return;
+ }
+
#ifdef USE_BUFFERING
if (bw_buffered[idx] && bw_FILE[idx]) {
failed = (fwrite(loc, (int) num, 1, bw_FILE[idx]) != 1);