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');