Merge pull request #1460 from LeandroLP23/fix/libc-setvbuf-default-size

fix(libc): give setvbuf a default buffer when the size is 0
This commit is contained in:
Adrià 2026-10-08 15:56:59 +02:00 committed by GitHub
commit 2b6cc18876
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 0 deletions

View File

@ -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) {

View File

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