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:
		| @@ -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@...> | ||||
|  | ||||
| 	* libc/include/string.h (strdupa): New macro function. | ||||
|   | ||||
| @@ -61,11 +61,7 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio), | ||||
|  | ||||
|   /* make sure we can write */ | ||||
|   if (cantwrite (ptr, fp)) | ||||
|     { | ||||
|       fp->_flags |= __SERR; | ||||
|       ptr->_errno = EBADF; | ||||
|       return EOF; | ||||
|     } | ||||
|     return EOF; | ||||
|  | ||||
|   iov = uio->uio_iov; | ||||
|   len = 0; | ||||
|   | ||||
| @@ -113,7 +113,8 @@ extern _READ_WRITE_RETURN_TYPE _EXFUN(__swrite64,(struct _reent *, void *, | ||||
|     }						\ | ||||
|   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)                                     \ | ||||
|   ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \ | ||||
|   | ||||
| @@ -54,11 +54,7 @@ _DEFUN(__swbuf_r, (ptr, c, fp), | ||||
|  | ||||
|   fp->_w = fp->_lbfsize; | ||||
|   if (cantwrite (ptr, fp)) | ||||
|     { | ||||
|       fp->_flags |= __SERR; | ||||
|       ptr->_errno = EBADF; | ||||
|       return EOF; | ||||
|     } | ||||
|     return EOF; | ||||
|   c = (unsigned char) c; | ||||
|  | ||||
|   ORIENT (fp, -1); | ||||
|   | ||||
| @@ -20,12 +20,13 @@ | ||||
| #include <_ansi.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <errno.h> | ||||
| #include "local.h" | ||||
|  | ||||
| /* | ||||
|  * Various output routines call wsetup to be sure it is safe to write, | ||||
|  * 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 | ||||
| @@ -44,7 +45,11 @@ _DEFUN(__swsetup_r, (ptr, fp), | ||||
|   if ((fp->_flags & __SWR) == 0) | ||||
|     { | ||||
|       if ((fp->_flags & __SRW) == 0) | ||||
| 	return EOF; | ||||
|         { | ||||
| 	  ptr->_errno = EBADF; | ||||
| 	  fp->_flags |= __SERR; | ||||
| 	  return EOF; | ||||
|         } | ||||
|       if (fp->_flags & __SRD) | ||||
| 	{ | ||||
| 	  /* clobber any ungetc data */ | ||||
| @@ -79,5 +84,11 @@ _DEFUN(__swsetup_r, (ptr, fp), | ||||
|   else | ||||
|     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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user