diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2006-03-07 22:20:18 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2006-03-07 22:20:18 +0000 |
commit | ce10f1789e0a4b1f968203b23a25006f9e7d9e6c (patch) | |
tree | e924ac883cf4a54171e10cba3b18d561cb823440 /newlib | |
parent | ddf12e6b7628ab1438f07c9edc18d43f1ac04eb9 (diff) | |
download | newlib-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.zip newlib-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.tar.gz newlib-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.tar.bz2 |
2006-03-07 Eric Blake <ebb9@byu.net>
* libc/stdio/freopen.c (_freopen_r) [HAVE_FCNTL]: For NULL
filename, allow read-only or write-only FILE atop O_RDWR file
descriptor.
* libc/stdio64/freopen64.c (_freopen64_r) [HAVE_FCNTL]: Likewise.
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 7 | ||||
-rw-r--r-- | newlib/libc/stdio/freopen.c | 16 | ||||
-rw-r--r-- | newlib/libc/stdio64/freopen64.c | 16 |
3 files changed, 25 insertions, 14 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 5b7f21b..552742b 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,10 @@ +2006-03-07 Eric Blake <ebb9@byu.net> + + * libc/stdio/freopen.c (_freopen_r) [HAVE_FCNTL]: For NULL + filename, allow read-only or write-only FILE atop O_RDWR file + descriptor. + * libc/stdio64/freopen64.c (_freopen64_r) [HAVE_FCNTL]: Likewise. + 2006-03-07 Jeff Johnston <jjohnstn@redhat.com> * libm/common/sf_isinf.c[_DOUBLE_IS_32BITS]: Undef isinf. diff --git a/newlib/libc/stdio/freopen.c b/newlib/libc/stdio/freopen.c index d5582d4..ae3444b 100644 --- a/newlib/libc/stdio/freopen.c +++ b/newlib/libc/stdio/freopen.c @@ -56,10 +56,10 @@ it). <[file]> and <[mode]> are used just as in <<fopen>>. If <[file]> is <<NULL>>, the underlying stream is modified rather than -closed. The file cannot change access mode (for example, if it was -previously read-only, <[mode]> must be "r", "rb", or "rt"), but can -change status such as append or binary mode. If modification is not -possible, failure occurs. +closed. The file cannot be given a more permissive access mode (for +example, a <[mode]> of "w" will fail on a read-only file descriptor), +but can change status such as append or binary mode. If modification +is not possible, failure occurs. RETURNS If successful, the result is the same as the argument <[fp]>. If the @@ -148,12 +148,14 @@ _DEFUN(_freopen_r, (ptr, file, mode, fp), #ifdef HAVE_FCNTL int oldflags; /* - * Reuse the file descriptor, but only if the access mode is - * unchanged. F_SETFL correctly ignores creation flags. + * Reuse the file descriptor, but only if the new access mode is + * equal or less permissive than the old. F_SETFL correctly + * ignores creation flags. */ f = fp->_file; if ((oldflags = _fcntl_r (ptr, f, F_GETFL, 0)) == -1 - || ((oldflags ^ oflags) & O_ACCMODE) != 0 + || ! ((oldflags & O_ACCMODE) == O_RDWR + || ((oldflags ^ oflags) & O_ACCMODE) == 0) || _fcntl_r (ptr, f, F_SETFL, oflags) == -1) f = -1; #else diff --git a/newlib/libc/stdio64/freopen64.c b/newlib/libc/stdio64/freopen64.c index 8acb957..6081e03 100644 --- a/newlib/libc/stdio64/freopen64.c +++ b/newlib/libc/stdio64/freopen64.c @@ -56,10 +56,10 @@ it). <[file]> and <[mode]> are used just as in <<fopen>>. If <[file]> is <<NULL>>, the underlying stream is modified rather than -closed. The file cannot change access mode (for example, if it was -previously read-only, <[mode]> must be "r", "rb", or "rt"), but can -change status such as append or binary mode. If modification is not -possible, failure occurs. +closed. The file cannot be given a more permissive access mode (for +example, a <[mode]> of "w" will fail on a read-only file descriptor), +but can change status such as append or binary mode. If modification +is not possible, failure occurs. RETURNS If successful, the result is the same as the argument <[fp]>. If the @@ -148,12 +148,14 @@ _DEFUN (_freopen64_r, (ptr, file, mode, fp), #ifdef HAVE_FCNTL int oldflags; /* - * Reuse the file descriptor, but only if the access mode is - * unchanged. F_SETFL correctly ignores creation flags. + * Reuse the file descriptor, but only if the new access mode is + * equal or less permissive than the old. F_SETFL correctly + * ignores creation flags. */ f = fp->_file; if ((oldflags = _fcntl_r (ptr, f, F_GETFL, 0)) == -1 - || ((oldflags ^ oflags) & O_ACCMODE) != 0 + || ! ((oldflags & O_ACCMODE) == O_RDWR + || ((oldflags ^ oflags) & O_ACCMODE) == 0) || _fcntl_r (ptr, f, F_SETFL, oflags) == -1) f = -1; #else |