Set stream errors in more cases

Also avoid unnecessarily setting errno when testing for TTY.
This commit is contained in:
Ulrich Drepper 2011-05-21 00:42:06 -04:00
parent 34a9094f49
commit aec84f5395
5 changed files with 33 additions and 6 deletions

View File

@ -1,3 +1,13 @@
2011-05-21 Ulrich Drepper <drepper@gmail.com>
[BZ #12792]
* libio/filedoalloc.c (local_isatty): New function.
(_IO_file_doallocate): Use local_isatty.
* stdio-common/perror.c (perror): In case a new stream is used
forward the stream error.
* stdio-common/vfprintf.c (ARGCHECK): For read-only streams also set
error flag.
2011-05-20 Ulrich Drepper <drepper@gmail.com> 2011-05-20 Ulrich Drepper <drepper@gmail.com>
[BZ #11869] [BZ #11869]

4
NEWS
View File

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2011-5-20 GNU C Library NEWS -- history of user-visible changes. 2011-5-21
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc. Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
See the end for copying conditions. See the end for copying conditions.
@ -16,7 +16,7 @@ Version 2.14
12454, 12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541, 12454, 12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541,
12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626, 12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626,
12631, 12650, 12653, 12655, 12660, 12681, 12685, 12711, 12713, 12714, 12631, 12650, 12653, 12655, 12660, 12681, 12685, 12711, 12713, 12714,
12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775 12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12792
* The RPC implementation in libc is obsoleted. Old programs keep working * The RPC implementation in libc is obsoleted. Old programs keep working
but new programs cannot be linked with the routines in libc anymore. but new programs cannot be linked with the routines in libc anymore.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1997, 2001, 2002 Free Software Foundation, Inc. /* Copyright (C) 1993, 1997, 2001, 2002, 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -41,7 +41,7 @@
4. Neither the name of the University nor the names of its contributors 4. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software may be used to endorse or promote products derived from this software
without specific prior written permission. without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -74,6 +74,17 @@
# include <device-nrs.h> # include <device-nrs.h>
#endif #endif
static int
local_isatty (int fd)
{
int save_errno = errno;
int res = isatty (fd);
__set_errno (save_errno);
return res;
}
/* /*
* Allocate a file buffer, or switch to unbuffered I/O. * Allocate a file buffer, or switch to unbuffered I/O.
* Per the ANSI C standard, ALL tty devices default to line buffered. * Per the ANSI C standard, ALL tty devices default to line buffered.
@ -109,7 +120,7 @@ _IO_file_doallocate (fp)
#ifdef DEV_TTY_P #ifdef DEV_TTY_P
DEV_TTY_P (&st) || DEV_TTY_P (&st) ||
#endif #endif
isatty (fp->_fileno)) local_isatty (fp->_fileno))
fp->_flags |= _IO_LINE_BUF; fp->_flags |= _IO_LINE_BUF;
} }
#if _IO_HAVE_ST_BLKSIZE #if _IO_HAVE_ST_BLKSIZE

View File

@ -1,4 +1,5 @@
/* Copyright (C) 1991-1993,1997,1998,2000-2005 Free Software Foundation, Inc. /* Copyright (C) 1991-1993,1997,1998,2000-2005,2011
Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -73,6 +74,10 @@ perror (const char *s)
position. Since the stderr stream wasn't used so far we just position. Since the stderr stream wasn't used so far we just
write to the descriptor. */ write to the descriptor. */
perror_internal (fp, s, errnum); perror_internal (fp, s, errnum);
if (_IO_ferror_unlocked (fp))
stderr->_flags |= _IO_ERR_SEEN;
/* Close the stream. */ /* Close the stream. */
fclose (fp); fclose (fp);
} }

View File

@ -52,6 +52,7 @@
CHECK_FILE (S, -1); \ CHECK_FILE (S, -1); \
if (S->_flags & _IO_NO_WRITES) \ if (S->_flags & _IO_NO_WRITES) \
{ \ { \
S->_flags |= _IO_ERR_SEEN; \
__set_errno (EBADF); \ __set_errno (EBADF); \
return -1; \ return -1; \
} \ } \