diff options
authorRich Felker <>2016-03-28 23:41:17 -0400
committerRich Felker <>2016-03-28 23:41:17 -0400
commit6d1a3dfeaf2caac4033a3c65822fb4e7e14866c7 (patch)
parent5978eb703ce0e64dd778a88c1ffffb76fe5e2202 (diff)
fix undefined pointer comparison in stdio-internal __toread
the comparison f->wpos > f->buf has undefined behavior when f->wpos is a null pointer, despite the intuition (and actual compiler behavior, for all known compilers) being that NULL > ptr is false for all valid pointers ptr. the purpose of the comparison is to determine if the write buffer is non-empty, and the idiom used elsewhere for that is comparison against f->wbase, which is either a null pointer when not writing, or equal to f->buf when writing. in the former case, both f->wpos and f->wbase are null; in the latter they are both non-null and point into the same array.
1 files changed, 1 insertions, 1 deletions
diff --git a/src/stdio/__toread.c b/src/stdio/__toread.c
index b08f5bb4..35f67b8f 100644
--- a/src/stdio/__toread.c
+++ b/src/stdio/__toread.c
@@ -3,7 +3,7 @@
int __toread(FILE *f)
f->mode |= f->mode-1;
- if (f->wpos > f->buf) f->write(f, 0, 0);
+ if (f->wpos > f->wbase) f->write(f, 0, 0);
f->wpos = f->wbase = f->wend = 0;
if (f->flags & F_NORD) {
f->flags |= F_ERR;