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 426e161d..f67199e8 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 f2fd7c9d..94f0a315 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 00000000..c5d55944
--- /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