about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-04-23 04:40:57 +0100
committerPetr Baudis <pasky@ucw.cz>2011-05-27 00:38:46 +0200
commit1b31d30e82cf802fa6e31ffa216264b035d339d1 (patch)
treebbf9fe8897414f09cf99a87ef47c40d450b62a7c
parent8277fdc1cd54428e54e112db7f5be89303951001 (diff)
downloadglibc-1b31d30e82cf802fa6e31ffa216264b035d339d1.tar.gz
glibc-1b31d30e82cf802fa6e31ffa216264b035d339d1.tar.xz
glibc-1b31d30e82cf802fa6e31ffa216264b035d339d1.zip
Use al possible bytes from fopen mode string.
(cherry picked from commit b722481ac27a296c5e4c4ef5ebb85f48a9efac95)
-rw-r--r--ChangeLog7
-rw-r--r--libio/fileops.c32
2 files changed, 23 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 9d8ecac572..ff00f2efd3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-04-22  Ulrich Drepper  <drepper@gmail.com>
+
+	[BZ #12685]
+	* libio/fileops.c (_IO_new_file_fopen): Scan up to 7 bytes of the
+	mode string.
+	Patch by Eric Blake <eblake@redhat.com>.
+
 2011-04-17  Ulrich Drepper  <drepper@gmail.com>
 
 	[BZ #12420]
diff --git a/libio/fileops.c b/libio/fileops.c
index 4698953f7a..1e7ef0754c 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -290,7 +290,7 @@ _IO_new_file_fopen (fp, filename, mode, is32not64)
 #ifdef _LIBC
   last_recognized = mode;
 #endif
-  for (i = 1; i < 6; ++i)
+  for (i = 1; i < 7; ++i)
     {
       switch (*++mode)
 	{
@@ -997,18 +997,18 @@ _IO_new_file_seekoff (fp, offset, dir, mode)
       /* Adjust for read-ahead (bytes is buffer). */
       offset -= fp->_IO_read_end - fp->_IO_read_ptr;
       if (fp->_offset == _IO_pos_BAD)
-        {
-          if (mode != 0)
-            goto dumb;
-          else
-            {
-              result = _IO_SYSSEEK (fp, 0, dir);
-              if (result == EOF)
-                return result;
-
-              fp->_offset = result;
-            }
-        }
+	{
+	  if (mode != 0)
+	    goto dumb;
+	  else
+	    {
+	      result = _IO_SYSSEEK (fp, 0, dir);
+	      if (result == EOF)
+		return result;
+
+	      fp->_offset = result;
+	    }
+	}
       /* Make offset absolute, assuming current pointer is file_ptr(). */
       offset += fp->_offset;
       if (offset < 0)
@@ -1270,7 +1270,7 @@ _IO_new_file_write (f, data, n)
 	{
 	  f->_flags |= _IO_ERR_SEEN;
 	  break;
-        }
+	}
       to_do -= count;
       data = (void *) ((char *) data + count);
     }
@@ -1358,12 +1358,12 @@ _IO_new_file_xsputn (f, data, n)
       do_write = to_do - (block_size >= 128 ? to_do % block_size : 0);
 
       if (do_write)
-        {
+	{
 	  count = new_do_write (f, s, do_write);
 	  to_do -= count;
 	  if (count < do_write)
 	    return n - to_do;
-        }
+	}
 
       /* Now write out the remainder.  Normally, this will fit in the
 	 buffer, but it's somewhat messier for line-buffered files,