Avoid panic on zero-byte writes to save files
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().
This commit is contained in:
@@ -172,6 +172,13 @@ bwrite(int fd, const genericptr_t loc, unsigned num)
|
|||||||
int idx = getidx(fd, NOFLG);
|
int idx = getidx(fd, NOFLG);
|
||||||
|
|
||||||
if (idx >= 0) {
|
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
|
#ifdef USE_BUFFERING
|
||||||
if (bw_buffered[idx] && bw_FILE[idx]) {
|
if (bw_buffered[idx] && bw_FILE[idx]) {
|
||||||
failed = (fwrite(loc, (int) num, 1, bw_FILE[idx]) != 1);
|
failed = (fwrite(loc, (int) num, 1, bw_FILE[idx]) != 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user