Browse Source

Fix buffering issue with large output through stdio

Tom Almeida 6 years ago
parent
commit
b43299642b
3 changed files with 17 additions and 1 deletions
  1. 6 1
      src/header/stdio/helpers.rs
  2. 1 0
      tests/Makefile
  3. 10 0
      tests/stdio/buffer.c

+ 6 - 1
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;
                 }

+ 1 - 0
tests/Makefile

@@ -15,6 +15,7 @@ EXPECT_BINS=\
 	setjmp \
 	signal \
 	stdio/all \
+	stdio/buffer \
 	stdio/freopen \
 	stdio/fwrite \
 	stdio/getc_unget \

+ 10 - 0
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");
+}