Date: Sat, 27 Sep 2008 02:30:08 GMT From: sean <seburke@rent.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/127335: [libc] fwrite(3) fails to generate error when applied to a read-only file Message-ID: <200809270230.m8R2U8Nx096700@freefall.freebsd.org>
index | next in thread | raw e-mail
The following reply was made to PR kern/127335; it has been noted by GNATS.
From: sean <seburke@rent.com>
To: bug-followup@FreeBSD.org, rfg@tristatelogic.com
Cc:
Subject: Re: kern/127335: [libc] fwrite(3) fails to generate error when
applied to a read-only file
Date: Fri, 26 Sep 2008 18:57:33 -0700
fwrite does set errno correctly. I modified the demo code
to call perror before and after, like so:
#include <stdio.h>
int
main (void)
{
perror ("pre-fwrite");
fwrite ("Hello world!", 1, 12, stdin);
perror ("post-fwrite");
if (ferror (stdin))
printf ("Error writing to stdin\n");
else if (feof (stdin))
printf ("EOF detected while writing to stdin\n");
else
printf ("This shouldn't happen!\n");
return 0;
}
Which produces this output:
pre-fwrite: Unknown error: 0
post-fwrite: Bad file descriptor
This shouldn't happen!
The relevant code is in wsetup.c, where is tests where the
'WRite' or 'Read-Write' flags are set, and fails if not:
if ((fp->_flags & __SWR) == 0) {
if ((fp->_flags & __SRW) == 0) {
errno = EBADF;
return (EOF);
}
I believe that the fix is to set the error flag on failure,
like so:
if ((fp->_flags & __SWR) == 0) {
if ((fp->_flags & __SRW) == 0) {
fp->_flags |= __SERR;
errno = EBADF;
return (EOF);
}
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809270230.m8R2U8Nx096700>
