summaryrefslogtreecommitdiff
path: root/libc/src/stdio/printf_core/vfprintf_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/src/stdio/printf_core/vfprintf_internal.h')
-rw-r--r--libc/src/stdio/printf_core/vfprintf_internal.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/libc/src/stdio/printf_core/vfprintf_internal.h b/libc/src/stdio/printf_core/vfprintf_internal.h
index 564441d3bf51..c47a03d741f9 100644
--- a/libc/src/stdio/printf_core/vfprintf_internal.h
+++ b/libc/src/stdio/printf_core/vfprintf_internal.h
@@ -51,8 +51,11 @@ LIBC_INLINE void funlockfile(::FILE *f) { ::funlockfile(f); }
LIBC_INLINE FileIOResult fwrite_unlocked(const void *ptr, size_t size,
size_t nmemb, ::FILE *f) {
// Need to use system errno in this case, as system write will set this errno
- // which we need to propagate back into our code.
- return {::fwrite_unlocked(ptr, size, nmemb, f), errno};
+ // which we need to propagate back into our code. fwrite only modifies errno
+ // if there was an error, and errno may have previously been nonzero. Only
+ // return errno if there was an error.
+ size_t members_written = ::fwrite_unlocked(ptr, size, nmemb, f);
+ return {members_written, members_written == nmemb ? 0 : errno};
}
#endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE
} // namespace internal