diff options
Diffstat (limited to 'lib/libc/stdio/refill.c')
-rw-r--r-- | lib/libc/stdio/refill.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/libc/stdio/refill.c b/lib/libc/stdio/refill.c index fa46d78..2d30e81 100644 --- a/lib/libc/stdio/refill.c +++ b/lib/libc/stdio/refill.c @@ -44,6 +44,7 @@ static const char rcsid[] = #include "namespace.h" #include <errno.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include "un-namespace.h" @@ -141,10 +142,18 @@ __srefill(FILE *fp) if (fp->_r == 0) fp->_flags |= __SEOF; else { + err: fp->_r = 0; fp->_flags |= __SERR; + fp->_flags &= ~__SOFF; } return (EOF); + } else if (fp->_flags & __SOFF) { + if (fp->_offset > OFF_MAX - fp->_r) { + errno = EOVERFLOW; + goto err; + } else + fp->_offset += fp->_r; } return (0); } |