Date: Fri, 12 Apr 1996 09:42:08 -0600 From: Nate Williams <nate@sri.MT.net> To: A JOSEPH KOSHY <koshy@india.hp.com> Cc: Nate Williams <nate@sri.MT.net>, hackers@freebsd.org Subject: Re: Critical stdio bug? Message-ID: <199604121542.JAA07272@rocky.sri.MT.net> In-Reply-To: <199604120837.AA276558230@fakir.india.hp.com> References: <199604120530.XAA06324@rocky.sri.MT.net> <199604120837.AA276558230@fakir.india.hp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> nw> OS's, but I had them available). However, on FreeBSD the EOF doesn't
> nw> get flushed out when it's read.
>
> The program works correctly on some HPUX machine I could lay my hands on
> too.
>
> The behaviour seems to be coming from: "lib/libc/stdio/refill.c";__srefill(fp)
>
> /* SysV does not make this test; take it out for compatibility */
> if (fp->_flags & __SEOF)
> return (EOF);
>
> The problem seems to be here (further down in the function) :
>
> fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size);
> fp->_flags &= ~__SMOD; /* buffer contents are again pristine */
> if (fp->_r <= 0) {
> if (fp->_r == 0)
> fp->_flags |= __SEOF;
> else {
> fp->_r = 0;
> fp->_flags |= __SERR;
> }
> return (EOF);
> }
>
>
> The manual page says:
>
> The system guarantees to read the number of bytes requested if
> the descriptor references a normal file that has that many bytes
> left before the end-of-file, but in no other case.
> [...]
> If successful, the number of bytes actually read is returned. Upon read-
> ing end-of-file, zero is returned. Otherwise, a -1 is returned and the
>
> Thus getting a return count of 0, does not always imply end-of-file forever
> on the file descriptor.
>
> So isn't the check at the beginning of the function incorrect?
I'm not confident to answer thjis, but I suspect the author (Chris
Torek) would know. :)
I'll forward him all of the relevant material in a separate email.
Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199604121542.JAA07272>
