This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.23-241-gf9123b5


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  f9123b5003e62b6e54996076e860f23aee9a0593 (commit)
      from  085bbece2c6afc5f13698b52fac0299445c4317f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=f9123b5003e62b6e54996076e860f23aee9a0593

commit f9123b5003e62b6e54996076e860f23aee9a0593
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Tue Apr 26 17:40:25 2016 -0300

    libio: Update internal fmemopen position after write (BZ #20005)
    
    Current GLIBC fmemopen fails with a simple testcase:
    
      char buffer[500] = "x";
      FILE *stream;
      stream = fmemopen(buffer, 500, "r+");
      fwrite("fish",sizeof(char),5,stream);
      printf("pos-1:%ld\n",ftell(stream));
      fflush(stream);
      printf("pos-2:%ld\n",ftell(stream));
    
    It returns:
    
      pos-1:5
      pos-2:0
    
    Where it should return:
    
      pos-1:5
      pos-2:5
    
    This is due the internal write function does not correctly update the internal
    object position state and then the seek operation returns a wrong value.  This
    patch fixes it.
    
    It fixes both BZ #20005 and BZ #19230 (marked as duplicated). A new test is
    added to check for such case.
    
    Tested on x86_64 and i686.
    
    	* libio/fmemopen.c (fmemopen_write): Update internal position after
    	write.
    	* stdio-common/Makefile (tests): Add tst-fmemopen4.c.
    	* stdio-common/tst-fmemopen4.c: New file..

diff --git a/ChangeLog b/ChangeLog
index 5d6ea9e..6fda4a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-04-26  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	[BZ #20005]
+	* libio/fmemopen.c (fmemopen_write): Update internal position after
+	write.
+	* stdio-common/Makefile (tests): Add tst-fmemopen4.c.
+	* stdio-common/tst-fmemopen4.c: New file..
+
 2016-04-26  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #19996]
diff --git a/libio/fmemopen.c b/libio/fmemopen.c
index 23b5c5f..9264b72 100644
--- a/libio/fmemopen.c
+++ b/libio/fmemopen.c
@@ -86,10 +86,10 @@ fmemopen_write (void *cookie, const char *b, size_t s)
 
   memcpy (&(c->buffer[pos]), b, s);
 
-  pos += s;
-  if ((size_t) pos > c->maxpos)
+  c->pos += s;
+  if ((size_t) c->pos > c->maxpos)
     {
-      c->maxpos = pos;
+      c->maxpos = c->pos;
       if (addnullc)
 	c->buffer[c->maxpos] = '\0';
     }
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 6c597c1..4c4834b 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -58,7 +58,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
 	 scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \
 	 bug-vfprintf-nargs tst-long-dbl-fphex tst-fphex-wide tst-sprintf3 \
 	 bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 tst-fmemopen3 \
-	 tst-printf-bz18872 tst-vfprintf-width-prec
+	 tst-printf-bz18872 tst-vfprintf-width-prec tst-fmemopen4
 
 test-srcs = tst-unbputc tst-printf
 
diff --git a/stdio-common/tst-fmemopen4.c b/stdio-common/tst-fmemopen4.c
new file mode 100644
index 0000000..e24f1ca
--- /dev/null
+++ b/stdio-common/tst-fmemopen4.c
@@ -0,0 +1,71 @@
+/* fmemopen tests for BZ#1930 and BZ#20005.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+
+/* Check if fflush does not reset the file position.  */
+static int
+do_test (void)
+{
+  char buffer[500] = "x";
+
+  FILE *stream = fmemopen (buffer, sizeof (buffer), "r+");
+  if (stream == NULL)
+    {
+      printf ("error: fmemopen could not open stream\n");
+      return 1;
+    }
+
+  const char test[] = "test";
+
+  size_t r = fwrite (test, sizeof (char), sizeof (test), stream);
+  if (r != sizeof (test))
+    {
+      printf ("error: fwrite returned %zu, expected %zu\n", r, sizeof(test));
+      return 1;
+    }
+
+  r = ftell (stream);
+  if (r != sizeof (test))
+    {
+      printf ("error: ftell return %zu, expected %zu\n", r, sizeof(test));
+      return 1;
+    }
+
+  if (fflush (stream) != 0)
+    {
+      printf ("error: fflush failed\n");
+      return 1;
+    }
+
+  r = ftell (stream);
+  if (r != sizeof (test))
+    {
+      printf ("error: ftell return %zu, expected %zu\n", r, sizeof(test));
+      return 1;
+    }
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |    8 ++++
 libio/fmemopen.c                                   |    6 +-
 stdio-common/Makefile                              |    2 +-
 .../tst-rwlock13.c => stdio-common/tst-fmemopen4.c |   41 ++++++++++----------
 4 files changed, 33 insertions(+), 24 deletions(-)
 copy nptl/tst-rwlock13.c => stdio-common/tst-fmemopen4.c (53%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]