Reading a write-only file doesn't set error condition (was Re: Cygwin fread on Write-Only File Descriptor returns undefined state)
Jeff Johnston
jjohnstn@redhat.com
Thu Jun 15 17:52:00 GMT 2006
Corinna Vinschen wrote:
> On Jun 14 16:57, Jeff Johnston wrote:
>
>>Jeff Johnston wrote:
>>
>>>Corinna Vinschen wrote:
>>>
>>>>So, I'd like to propose the below patch. I assume a similar patch
>>>>should be ok for __sfvwrite, too, isn't it? There's a call to
>>>>cantwrite() which only returns EOF but which probably should also
>>>>set the error condition and errno.
>>>>
>>>
>>>This opens a can of worms. You can't just use _REENT to set errno. One
>>>has to provide _r versions of the read/write functions. I have just
>>>made a patch and am verifying it builds for x86-linux. I will post the
>>>patch when I am ready to check it in.
>>>
>>>-- Jeff J.
>>>
>>
>>I have checked in the patch. The testcase runs successfully and I am
>>able to build/run x86-linux successfully. Let me know if it causes any
>>problems for Cygwin.
>
>
> Thanks for the patch, but unfortunately it does cause problems.
> I found three problems:
>
> - Typo in stdio.h, "struct _REENT" instead of "struct _reent".
> - Missing conversion from crlf to crlf_r calls in fread.c.
> - Removing __srget and __swbuf functions breaks backward compatibility.
> Older applications built up to yesterday against a share lib version
> of newlib will refuse to run with a newer newlib, due to missing
> symbols __srget and __swbuf in the shared lib.
>
Thanks Corinna. Patch checked in.
-- Jeff J.
> Patch below.
>
>
> Thanks,
> Corinna
>
>
> * libc/include/stdio.h (__sgetc_r): Fix typo.
> * libc/stdio/fread.c (_fread_r): Convert crlf calls to crlf_r.
> * libc/stdio/rget.c (__srbuf): Reinstantiate.
> * libc/stdio/wbuf.c (__swbuf): Ditto.
>
>
> Index: libc/include/stdio.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/stdio.h,v
> retrieving revision 1.36
> diff -u -p -r1.36 stdio.h
> --- libc/include/stdio.h 14 Jun 2006 20:49:11 -0000 1.36
> +++ libc/include/stdio.h 15 Jun 2006 12:28:24 -0000
> @@ -402,7 +402,7 @@ FILE *_EXFUN(funopen,(const _PTR _cookie
> #define __sgetc_raw_r(__ptr, __f) (--(__f)->_r < 0 ? __srget_r(__ptr, __f) : (int)(*(__f)->_p++))
>
> #ifdef __SCLE
> -static __inline__ int __sgetc_r(struct _REENT *__ptr, FILE *__p)
> +static __inline__ int __sgetc_r(struct _reent *__ptr, FILE *__p)
> {
> int __c = __sgetc_raw_r(__ptr, __p);
> if ((__p->_flags & __SCLE) && (__c == '\r'))
> Index: libc/stdio/fread.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdio/fread.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 fread.c
> --- libc/stdio/fread.c 14 Jun 2006 20:49:11 -0000 1.11
> +++ libc/stdio/fread.c 15 Jun 2006 12:28:24 -0000
> @@ -196,7 +196,7 @@ _DEFUN(_fread_r, (ptr, buf, size, count,
> if (fp->_flags & __SCLE)
> {
> _funlockfile (fp);
> - return crlf (fp, buf, total-resid, 1) / size;
> + return crlf_r (ptr, fp, buf, total-resid, 1) / size;
> }
> #endif
> _funlockfile (fp);
> @@ -221,7 +221,7 @@ _DEFUN(_fread_r, (ptr, buf, size, count,
> if (fp->_flags & __SCLE)
> {
> _funlockfile (fp);
> - return crlf (fp, buf, total-resid, 1) / size;
> + return crlf_r (ptr, fp, buf, total-resid, 1) / size;
> }
> #endif
> _funlockfile (fp);
> @@ -238,7 +238,7 @@ _DEFUN(_fread_r, (ptr, buf, size, count,
> if (fp->_flags & __SCLE)
> {
> _funlockfile (fp);
> - return crlf(fp, buf, total, 0) / size;
> + return crlf_r(ptr, fp, buf, total, 0) / size;
> }
> #endif
> _funlockfile (fp);
> Index: libc/stdio/rget.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdio/rget.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 rget.c
> --- libc/stdio/rget.c 14 Jun 2006 20:49:11 -0000 1.3
> +++ libc/stdio/rget.c 15 Jun 2006 12:28:24 -0000
> @@ -43,3 +43,13 @@ _DEFUN(__srget_r, (ptr, fp),
> }
> return EOF;
> }
> +
> +/* This function isn't any longer declared in stdio.h, but it's
> + required for backward compatibility with applications built against
> + earlier dynamically built newlib libraries. */
> +int
> +_DEFUN(__srget, (fp),
> + register FILE *fp)
> +{
> + return __srget_r (_REENT, fp);
> +}
> Index: libc/stdio/wbuf.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdio/wbuf.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 wbuf.c
> --- libc/stdio/wbuf.c 14 Jun 2006 20:49:11 -0000 1.4
> +++ libc/stdio/wbuf.c 15 Jun 2006 12:28:24 -0000
> @@ -85,3 +85,14 @@ _DEFUN(__swbuf_r, (ptr, c, fp),
> return EOF;
> return c;
> }
> +
> +/* This function isn't any longer declared in stdio.h, but it's
> + required for backward compatibility with applications built against
> + earlier dynamically built newlib libraries. */
> +int
> +_DEFUN(__swbuf, (c, fp),
> + register int c _AND
> + register FILE *fp)
> +{
> + return __swbuf_r (_REENT, c, fp);
> +}
>
More information about the Newlib
mailing list