printf: set errno for read-only stream
* libc/stdio/wsetup.c (__swsetup_r): Set errno on failure. * libc/stdio/fvwrite.c (__sfvwrite_r): Simplify. * libc/stdio/wbuf.c (__swbuf_r): Likewise. * libc/stdio/local.h (cantwrite): Adjust comment.
This commit is contained in:
parent
0fdbb2d0cd
commit
4226571d7a
@ -1,3 +1,10 @@
|
|||||||
|
2011-06-13 Eric Blake <eblake@redhat.com>
|
||||||
|
|
||||||
|
* libc/stdio/wsetup.c (__swsetup_r): Set errno on failure.
|
||||||
|
* libc/stdio/fvwrite.c (__sfvwrite_r): Simplify.
|
||||||
|
* libc/stdio/wbuf.c (__swbuf_r): Likewise.
|
||||||
|
* libc/stdio/local.h (cantwrite): Adjust comment.
|
||||||
|
|
||||||
2011-06-09 Yaakov Selkowitz <yselkowitz@...>
|
2011-06-09 Yaakov Selkowitz <yselkowitz@...>
|
||||||
|
|
||||||
* libc/include/string.h (strdupa): New macro function.
|
* libc/include/string.h (strdupa): New macro function.
|
||||||
|
@ -61,11 +61,7 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
|
|||||||
|
|
||||||
/* make sure we can write */
|
/* make sure we can write */
|
||||||
if (cantwrite (ptr, fp))
|
if (cantwrite (ptr, fp))
|
||||||
{
|
return EOF;
|
||||||
fp->_flags |= __SERR;
|
|
||||||
ptr->_errno = EBADF;
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
iov = uio->uio_iov;
|
iov = uio->uio_iov;
|
||||||
len = 0;
|
len = 0;
|
||||||
|
@ -113,7 +113,8 @@ extern _READ_WRITE_RETURN_TYPE _EXFUN(__swrite64,(struct _reent *, void *,
|
|||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
/* Return true iff the given FILE cannot be written now. */
|
/* Return true and set errno and stream error flag iff the given FILE
|
||||||
|
cannot be written now. */
|
||||||
|
|
||||||
#define cantwrite(ptr, fp) \
|
#define cantwrite(ptr, fp) \
|
||||||
((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \
|
((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \
|
||||||
|
@ -54,11 +54,7 @@ _DEFUN(__swbuf_r, (ptr, c, fp),
|
|||||||
|
|
||||||
fp->_w = fp->_lbfsize;
|
fp->_w = fp->_lbfsize;
|
||||||
if (cantwrite (ptr, fp))
|
if (cantwrite (ptr, fp))
|
||||||
{
|
return EOF;
|
||||||
fp->_flags |= __SERR;
|
|
||||||
ptr->_errno = EBADF;
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
c = (unsigned char) c;
|
c = (unsigned char) c;
|
||||||
|
|
||||||
ORIENT (fp, -1);
|
ORIENT (fp, -1);
|
||||||
|
@ -20,12 +20,13 @@
|
|||||||
#include <_ansi.h>
|
#include <_ansi.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
#include "local.h"
|
#include "local.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Various output routines call wsetup to be sure it is safe to write,
|
* Various output routines call wsetup to be sure it is safe to write,
|
||||||
* because either _flags does not include __SWR, or _buf is NULL.
|
* because either _flags does not include __SWR, or _buf is NULL.
|
||||||
* _wsetup returns 0 if OK to write, nonzero otherwise.
|
* _wsetup returns 0 if OK to write, nonzero and set errno otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -44,7 +45,11 @@ _DEFUN(__swsetup_r, (ptr, fp),
|
|||||||
if ((fp->_flags & __SWR) == 0)
|
if ((fp->_flags & __SWR) == 0)
|
||||||
{
|
{
|
||||||
if ((fp->_flags & __SRW) == 0)
|
if ((fp->_flags & __SRW) == 0)
|
||||||
return EOF;
|
{
|
||||||
|
ptr->_errno = EBADF;
|
||||||
|
fp->_flags |= __SERR;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
if (fp->_flags & __SRD)
|
if (fp->_flags & __SRD)
|
||||||
{
|
{
|
||||||
/* clobber any ungetc data */
|
/* clobber any ungetc data */
|
||||||
@ -62,7 +67,7 @@ _DEFUN(__swsetup_r, (ptr, fp),
|
|||||||
* A string I/O file should not explicitly allocate a buffer
|
* A string I/O file should not explicitly allocate a buffer
|
||||||
* unless asprintf is being used.
|
* unless asprintf is being used.
|
||||||
*/
|
*/
|
||||||
if (fp->_bf._base == NULL
|
if (fp->_bf._base == NULL
|
||||||
&& (!(fp->_flags & __SSTR) || (fp->_flags & __SMBF)))
|
&& (!(fp->_flags & __SSTR) || (fp->_flags & __SMBF)))
|
||||||
__smakebuf_r (ptr, fp);
|
__smakebuf_r (ptr, fp);
|
||||||
|
|
||||||
@ -79,5 +84,11 @@ _DEFUN(__swsetup_r, (ptr, fp),
|
|||||||
else
|
else
|
||||||
fp->_w = fp->_flags & __SNBF ? 0 : fp->_bf._size;
|
fp->_w = fp->_flags & __SNBF ? 0 : fp->_bf._size;
|
||||||
|
|
||||||
return (!fp->_bf._base && (fp->_flags & __SMBF)) ? EOF : 0;
|
if (!fp->_bf._base && (fp->_flags & __SMBF))
|
||||||
|
{
|
||||||
|
/* __smakebuf_r set errno, but not flag */
|
||||||
|
fp->_flags |= __SERR;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user