From b43299642b24d6bec8479c980b68a9251033dc60 Mon Sep 17 00:00:00 2001 From: Tom Almeida <tommoa256@gmail.com> Date: Fri, 21 Sep 2018 15:21:39 +0200 Subject: [PATCH] Fix buffering issue with large output through stdio --- src/header/stdio/helpers.rs | 7 ++++++- tests/Makefile | 1 + tests/stdio/buffer.c | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/stdio/buffer.c diff --git a/src/header/stdio/helpers.rs b/src/header/stdio/helpers.rs index 426e161db..f67199e8a 100644 --- a/src/header/stdio/helpers.rs +++ b/src/header/stdio/helpers.rs @@ -97,7 +97,7 @@ pub fn fwritex(buf: *const u8, l: size_t, stream: &mut FILE) -> size_t { // We can't write to this stream return 0; } - if let Some((wbase, wpos, wend)) = stream.write { + if let Some((wbase, mut wpos, wend)) = stream.write { if l > wend - wpos { // We can't fit all of buf in the buffer return stream.write(buf); @@ -110,6 +110,11 @@ pub fn fwritex(buf: *const u8, l: size_t, stream: &mut FILE) -> size_t { } if i > 0 { let n = stream.write(buf); + match stream.write { + Some((_, new_wpos, _)) => wpos = new_wpos, + None => unreachable!("stream.write should never be None after a write call") + } + if n < i { return n; } diff --git a/tests/Makefile b/tests/Makefile index f2fd7c9d8..94f0a315c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,6 +15,7 @@ EXPECT_BINS=\ setjmp \ signal \ stdio/all \ + stdio/buffer \ stdio/freopen \ stdio/fwrite \ stdio/getc_unget \ diff --git a/tests/stdio/buffer.c b/tests/stdio/buffer.c new file mode 100644 index 000000000..c5d55944b --- /dev/null +++ b/tests/stdio/buffer.c @@ -0,0 +1,10 @@ +#include <stdio.h> + +int main() { + // Tests what used to be a bug with buffering + fwrite("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 1, 999, stdout); + fwrite("Test\n", 1, 5, stdout); + fwrite("Hello\nWorld\n", 1, 12, stdout); + puts("It works"); + puts("No buffering issues here"); +} -- GitLab