fix undefined pointer comparison in stdio-internal __toread
authorRich Felker <dalias@aerifal.cx>
Tue, 29 Mar 2016 03:41:17 +0000 (23:41 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 29 Mar 2016 03:41:17 +0000 (23:41 -0400)
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.

src/stdio/__toread.c

index b08f5bb440345efefc5dd0f4d8679e0a56eb91e0..35f67b8f8d9386dff7025d88f073835e390b4733 100644 (file)
@@ -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;