summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2006-03-07 22:20:18 +0000
committerJeff Johnston <jjohnstn@redhat.com>2006-03-07 22:20:18 +0000
commitce10f1789e0a4b1f968203b23a25006f9e7d9e6c (patch)
treee924ac883cf4a54171e10cba3b18d561cb823440
parentddf12e6b7628ab1438f07c9edc18d43f1ac04eb9 (diff)
downloadcygnal-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.tar.gz
cygnal-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.tar.bz2
cygnal-ce10f1789e0a4b1f968203b23a25006f9e7d9e6c.zip
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.
-rw-r--r--newlib/ChangeLog7
-rw-r--r--newlib/libc/stdio/freopen.c16
-rw-r--r--newlib/libc/stdio64/freopen64.c16
3 files changed, 25 insertions, 14 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 5b7f21b5d..552742b0a 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 d5582d421..ae3444b1b 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 8acb957da..6081e03dc 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