From 2e9ab8cc5959d21716f0d14f7ed6015a4f2ad5a5 Mon Sep 17 00:00:00 2001 From: LeandroLP23 Date: Thu, 8 Oct 2026 09:58:37 +0200 Subject: [PATCH] fix(libc): give setvbuf a default buffer when the size is 0 FreeBSD's setvbuf takes a zero size with _IOFBF or _IOLBF as "pick the buffer size". The UCRT rejects sizes below 2 for those modes through its invalid parameter handler, so the call failed on Windows and a test process was terminated. A zero size now drops the given buffer and asks the host for one of BUFSIZ bytes. Co-Authored-By: Claude Opus 5.5 --- core/libs/prx/libc/src/StandardStreams.cpp | 4 ++++ core/libs/tests/GuestStandardStreams.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/core/libs/prx/libc/src/StandardStreams.cpp b/core/libs/prx/libc/src/StandardStreams.cpp index 32837f9cf..856937ab4 100644 --- a/core/libs/prx/libc/src/StandardStreams.cpp +++ b/core/libs/prx/libc/src/StandardStreams.cpp @@ -78,6 +78,10 @@ int APS5_VABI fileno_nid_postfix(FileStream* stream) { int APS5_VABI setvbuf_nid_postfix(FileStream* stream, char* buffer, int mode, std::size_t size) { if (mode < 0 || mode > 2) return -1; const int native = mode == 0 ? _IOFBF : mode == 1 ? _IOLBF : _IONBF; + if (native != _IONBF && size == 0) { + buffer = nullptr; + size = BUFSIZ; + } return std::setvbuf(GetNativeStream(stream), buffer, native, size); } void APS5_VABI setbuf_nid_postfix(FileStream* stream, char* buffer) { diff --git a/core/libs/tests/GuestStandardStreams.cpp b/core/libs/tests/GuestStandardStreams.cpp index 714912017..99f344536 100644 --- a/core/libs/tests/GuestStandardStreams.cpp +++ b/core/libs/tests/GuestStandardStreams.cpp @@ -180,6 +180,10 @@ int main() { Require(&guest == &stream.GuestState()); Require(guest.position == nullptr && guest.readRemaining == 0 && guest.writeRemaining == 0); Require(guest.descriptor == fileno_nid_postfix(&stream)); + FileStream lineBuffered(std::tmpfile()); + Require(setvbuf_nid_postfix(&lineBuffered, nullptr, 1, 0) == 0); + FileStream fullyBuffered(std::tmpfile()); + Require(setvbuf_nid_postfix(&fullyBuffered, nullptr, 0, 0) == 0); Require(setvbuf_nid_postfix(&stream, nullptr, 2, 0) == 0); Require(fputc_nid_postfix('A', &stream) == 'A'); Require(--guest.writeRemaining < 0 && __swbuf_nid_postfix('\n', &stream) == '\n');