fix null pointer subtraction and comparison in stdio
authorRich Felker <dalias@aerifal.cx>
Sun, 16 Sep 2018 17:46:46 +0000 (13:46 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 16 Sep 2018 18:37:22 +0000 (14:37 -0400)
commit849e7603e9004fd292a93df64dd3524025f2987a
tree4a8e8b168be59045998b430f7654464025affeaf
parent5cd309f0cc3c92f3fabbaa499652a8329137c4de
fix null pointer subtraction and comparison in stdio

morally, for null pointers a and b, a-b, a<b, and a>b should all be
defined as 0; however, C does not define any of them.

the stdio implementation makes heavy use of such pointer comparison
and subtraction for buffer logic, and also uses null pos/base/end
pointers to indicate that the FILE is not in the corresponding (read
or write) mode ready for accesses through the buffer.

all of the comparisons are fixed trivially by using != in place of the
relational operators, since the opposite relation (e.g. pos>end) is
logically impossible. the subtractions have been reviewed to check
that they are conditional the stream being in the appropriate reading-
or writing-through-buffer mode, with checks added where needed.

in fgets and getdelim, the checks added should improve performance for
unbuffered streams by avoiding a do-nothing call to memchr, and should
be negligible for buffered streams.
14 files changed:
src/internal/stdio_impl.h
src/stdio/__overflow.c
src/stdio/__stdio_exit.c
src/stdio/__toread.c
src/stdio/ext2.c
src/stdio/fflush.c
src/stdio/fgetln.c
src/stdio/fgets.c
src/stdio/fgetwc.c
src/stdio/fread.c
src/stdio/fseek.c
src/stdio/ftell.c
src/stdio/getdelim.c
src/stdio/vfwscanf.c