fix line-buffered flush omission for odd usage of putc-family functions
authorRich Felker <dalias@aerifal.cx>
Thu, 11 Feb 2016 00:10:34 +0000 (19:10 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 11 Feb 2016 00:10:34 +0000 (19:10 -0500)
as specified, the int argument providing the character to write is
converted to type unsigned char. for the actual write to buffer,
conversion happened implicitly via the assignment operator; however,
the logic to check whether the argument was a newline used the
original int value. thus usage such as putchar('\n'+0x100) failed to
produce a flush.

src/internal/stdio_impl.h

index 0dd7fb5e41ef0ef839f433e6cf11901303d97460..7cdf729de8e7e8146e96bae75662ce4bac0c0cd0 100644 (file)
@@ -86,7 +86,8 @@ void __ofl_unlock(void);
 #define getc_unlocked(f) \
        ( ((f)->rpos < (f)->rend) ? *(f)->rpos++ : __uflow((f)) )
 
-#define putc_unlocked(c, f) ( ((c)!=(f)->lbf && (f)->wpos<(f)->wend) \
+#define putc_unlocked(c, f) \
+       ( ((unsigned char)(c)!=(f)->lbf && (f)->wpos<(f)->wend) \
        ? *(f)->wpos++ = (c) : __overflow((f),(c)) )
 
 /* Caller-allocated FILE * operations */