diff options
| author | Andrey A. Chernov <ache@FreeBSD.org> | 2001-08-15 02:07:47 +0000 | 
|---|---|---|
| committer | Andrey A. Chernov <ache@FreeBSD.org> | 2001-08-15 02:07:47 +0000 | 
| commit | d9e3eff33a03bcb668a9c9924443bf3b2d18bd15 (patch) | |
| tree | c651de630103d0b82ee727fa499a87af0697e6f6 /lib/libc/stdio/stdio.c | |
| parent | ba8140a6f656845b1445c969430263a01670f9d0 (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdio/stdio.c')
| -rw-r--r-- | lib/libc/stdio/stdio.c | 19 | 
1 files changed, 17 insertions, 2 deletions
| diff --git a/lib/libc/stdio/stdio.c b/lib/libc/stdio/stdio.c index 57be5bb42140..58fafcbc170f 100644 --- a/lib/libc/stdio/stdio.c +++ b/lib/libc/stdio/stdio.c @@ -43,6 +43,7 @@ static const char rcsid[] =  #endif /* LIBC_SCCS and not lint */  #include "namespace.h" +#include <errno.h>  #include <fcntl.h>  #include <unistd.h>  #include <stdio.h> @@ -94,10 +95,24 @@ __sseek(cookie, offset, whence)  	register FILE *fp = cookie;  	register off_t ret; +	/* +	 * Disallow negative seeks per POSIX. +	 * It is needed here to help upper level caller +	 * (fseek) in the cases it can't detect. +	 */ +	if (whence == SEEK_SET && (off_t)offset < 0) { +		errno = EINVAL; +		return (-1); +	}  	ret = lseek(fp->_file, (off_t)offset, whence); -	if (ret == -1) +	if (ret < 0) { +		if (ret != -1) { +			/* Resulting seek is negative! */ +			ret = -1; +			errno = EINVAL; +		}  		fp->_flags &= ~__SOFF; -	else { +	} else {  		fp->_flags |= __SOFF;  		fp->_offset = ret;  	} | 
