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.21-574-gccfa271


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  ccfa271f8be0f7c210713e043246b2ece75c2a87 (commit)
       via  fdb7d390dd0d96e4a8239c46f3aa64598b90842b (commit)
      from  1c1e3125206ef810dc7282023f6267a33b486233 (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=ccfa271f8be0f7c210713e043246b2ece75c2a87

commit ccfa271f8be0f7c210713e043246b2ece75c2a87
Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
Date:   Fri Jun 13 17:38:32 2014 -0300

    libio: Update tst-fmemopen2.c
    
    This patch updates tst-fmemopen2 to check for fmemopen with NULL buffer
    inputs and also refactor the code a bit.
    
    The test relies on a POSIX compliant fmemopen implementation.
    
    	* stdio-common/tst-fmemopen2.c (do_test): Add test for NULL and zero
    	length buffers.
    	* stdio-common/tst-fmemopen.c (do_test): Refactor to use
    	test-skeleton.c.

diff --git a/ChangeLog b/ChangeLog
index 1cf34d5..6689220 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2015-07-08  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+	* stdio-common/tst-fmemopen2.c (do_test): Add test for NULL and zero
+	length buffers.
+	* stdio-common/tst-fmemopen.c (do_test): Refactor to use
+	test-skeleton.c.
+
 	[BZ #6544]
 	[BZ #11216]
 	[BZ #12836]
diff --git a/stdio-common/tst-fmemopen2.c b/stdio-common/tst-fmemopen2.c
index e9d8b63..2f26f20 100644
--- a/stdio-common/tst-fmemopen2.c
+++ b/stdio-common/tst-fmemopen2.c
@@ -1,71 +1,257 @@
+/* fmemopen tests.
+   Copyright (C) 2015 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>
+#include <errno.h>
 
-
+/* Check fmemopen with user provided buffer open for write.  */
 static int
-do_test (void)
+do_test_with_buffer (void)
 {
   int result = 0;
   char buf[100];
-  FILE *fp = fmemopen (buf, sizeof (buf), "w");
+  const size_t nbuf = sizeof (buf);
+
+  FILE *fp = fmemopen (buf, nbuf, "w");
   if (fp == NULL)
     {
-      puts ("fmemopen failed");
-      return 0;
+      printf ("FAIL: fmemopen failedi (%s)\n", __FUNCTION__);
+      return 1;
     }
+
+  /* Default write operation, check if file position is correct after it.  */
   static const char str[] = "hello world";
-#define nstr (sizeof (str) - 1)
+  const size_t nstr = sizeof (str) - 1;
   fputs (str, fp);
   off_t o = ftello (fp);
   if (o != nstr)
     {
-      printf ("first ftello returned %jd, expected %zu\n",
-	      (intmax_t) o, nstr);
+      printf ("FAIL: first ftello returned %jd, expected %zu\n",
+	      (intmax_t)o, nstr);
       result = 1;
     }
+
+  /* Rewind stream and seek tests, the position size should be equal to
+     buffer size provided in open function.  */
   rewind (fp);
   o = ftello (fp);
   if (o != 0)
     {
-      printf ("second ftello returned %jd, expected 0\n", (intmax_t) o);
+      printf ("FAIL: second ftello returned %jd, expected 0\n",
+	      (intmax_t)o);
       result = 1;
     }
   if (fseeko (fp, 0, SEEK_END) != 0)
     {
-      puts ("fseeko failed");
-      return 1;
+      printf ("FAIL: fseeko failed\n");
+      result = 1;
     }
   o = ftello (fp);
   if (o != nstr)
     {
-      printf ("third ftello returned %jd, expected %zu\n",
-	      (intmax_t) o, nstr);
+      printf ("FAIL: third ftello returned %jd, expected %zu\n",
+	      (intmax_t)o, nbuf);
       result = 1;
     }
+
+  /* Rewind the stream and recheck by using a shorter string.  */
   rewind (fp);
   static const char str2[] = "just hello";
-#define nstr2 (sizeof (str2) - 1)
+  const size_t nstr2 = sizeof (str2) - 1;
   assert (nstr2 < nstr);
   fputs (str2, fp);
   o = ftello (fp);
   if (o != nstr2)
     {
-      printf ("fourth ftello returned %jd, expected %zu\n",
-	      (intmax_t) o, nstr2);
+      printf ("FAIL: fourth ftello returned %jd, expected %zu\n",
+	      (intmax_t)o, nstr2);
       result = 1;
     }
   fclose (fp);
+
+  /* Again, but now with a larger string.  */
   static const char str3[] = "just hellod";
   if (strcmp (buf, str3) != 0)
     {
-      printf ("final string is \"%s\", expected \"%s\"\n",
+      printf ("FAIL: final string is \"%s\", expected \"%s\"\n",
               buf, str3);
       result = 1;
     }
   return result;
 }
 
+/* Check fmemopen without user provided buffer open for write.  */
+static int
+do_test_without_buffer (void)
+{
+  int result = 0;
+  const size_t nbuf = 100;
+
+  FILE *fp = fmemopen (NULL, nbuf, "w");
+  if (fp == NULL)
+    {
+      printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__);
+      return 1;
+    }
+
+  static const char str[] = "hello world";
+  const size_t nstr = sizeof (str) - 1;
+
+  /* Default write operation, check if file position is correct after it.  */
+  fputs (str, fp);
+  off_t o = ftello (fp);
+  if (o != nstr)
+    {
+      printf ("FAIL: first ftello returned %ld, expected %zu\n", o, nstr);
+      result = 1;
+    }
+  if (fseeko (fp, 0, SEEK_END) != 0)
+    {
+      printf ("FAIL: fseeko failed\n");
+      result = 1;
+    }
+  o = ftello (fp);
+  if (o != nstr)
+    {
+      printf ("FAIL: second ftello returned %ld, expected %zu\n", o, nbuf);
+      result = 1;
+    }
+
+  /* Rewind the stream and recheck by using a shorter string.  */
+  rewind (fp);
+  static const char str2[] = "just hello";
+  const size_t nstr2 = sizeof (str2) - 1;
+  assert (nstr2 < nstr);
+  fputs (str2, fp);
+  o = ftello (fp);
+  if (o != nstr2)
+    {
+      printf ("FAIL: third ftello returned %ld, expected %zu\n", o, nstr2);
+      result = 1;
+    }
+  fclose (fp);
+
+  return result;
+}
+
+/* Check fmemopen with a buffer lenght of zero.  */
+static int
+do_test_length_zero (void)
+{
+  int result = 0;
+  FILE *fp;
+#define BUFCONTENTS "testing buffer"
+  char buf[100] = BUFCONTENTS;
+  const size_t nbuf = 0;
+  int r;
+
+  fp = fmemopen (buf, nbuf, "r");
+  if (fp == NULL)
+    {
+      printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__);
+      return 1;
+    }
+
+  /* Reading any data on a zero-length buffer should return EOF.  */
+  if ((r = fgetc (fp)) != EOF)
+    {
+      printf ("FAIL: fgetc on a zero-length returned: %d\n", r);
+      result = 1;
+    }
+  off_t o = ftello (fp);
+  if (o != 0)
+    {
+      printf ("FAIL: first ftello returned %ld, expected 0\n", o);
+      result = 1;
+    }
+  fclose (fp);
+
+  /* Writing any data shall start at current position and shall not pass
+     current buffer size beyond the size in fmemopen call.  */
+  fp = fmemopen (buf, nbuf, "w");
+  if (fp == NULL)
+    {
+      printf ("FAIL: second fmemopen failed (%s)\n", __FUNCTION__);
+      return 1;
+    }
+
+  static const char str[] = "hello world";
+  /* Because of buffering, the fputs call itself will not fail. However the
+     final buffer should be not changed because length 0 was passed to the
+     fmemopen call.  */
+  fputs (str, fp);
+  r = 0;
+  errno = 0;
+  if (fflush (fp) != EOF)
+    {
+      printf ("FAIL: fflush did not return EOF\n");
+      fclose (fp);
+      return 1;
+    }
+  if (errno != ENOSPC)
+    {
+      printf ("FAIL: errno is %i (expected ENOSPC)\n", errno);
+      fclose (fp);
+      return 1;
+    }
+
+  fclose (fp);
+
+  if (strcmp (buf, BUFCONTENTS) != 0)
+    {
+      printf ("FAIL: strcmp (%s, %s) failed\n", buf, BUFCONTENTS);
+      return 1;
+    }
+
+  /* Different than 'w' mode, 'w+' truncates the buffer.  */
+  fp = fmemopen (buf, nbuf, "w+");
+  if (fp == NULL)
+    {
+      printf ("FAIL: third fmemopen failed (%s)\n", __FUNCTION__);
+      return 1;
+    }
+
+  fclose (fp);
+
+  if (strcmp (buf, "") != 0)
+    {
+      printf ("FAIL: strcmp (%s, \"\") failed\n", buf);
+      return 1;
+    }
+
+  return result;
+}
+
+static int
+do_test (void)
+{
+  int ret = 0;
+
+  ret += do_test_with_buffer ();
+  ret += do_test_without_buffer ();
+  ret += do_test_length_zero ();
+
+  return ret;
+}
+
 #define TEST_FUNCTION do_test ()
 #include "../test-skeleton.c"

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

commit fdb7d390dd0d96e4a8239c46f3aa64598b90842b
Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
Date:   Mon Jun 9 16:19:25 2014 -0300

    libio: fmemopen rewrite to POSIX compliance
    
    This patch added a new fmemopen version, for glibc 2.22, that aims to be
    POSIX complaint.  It fixes some long-stading glibc fmemopen issues, such
    as:
    
    * it changes the way fseek with SEEK_END works on fmemopen to seek
      relative to buffer size instead of first '\0'.  This is default mode and
      'b' opening mode does not change internal behavior (bz#6544).
    
    * fix apending opening mode to use as start position either first null
      byte of len specified in function call (bz#13152 and #13151).
    
    * remove binary option 'b' and internal different handling (bz#12836)
    
    * fix seek/SEE_END with negative values (bz#14292).
    
    A compatibility symbol is provided to with old behavior for older symbols
    version (2.2.5).
    
    	* include/stdio.h (fmemopen): Remove hidden prototype.
    	(__fmemopen): Add new hidden prototype.
    	* libio/Makefile: Add oldfmemopen object.
    	* libio/Versions [GLIBC_2.22]: Add new fmemopen symbol.
    	* libio/fmemopen.c (__fmemopen): Function rewrite to be POSIX
    	compliance.
    	* libio/oldfmemopen.c: New file: old fmemopen implementation for
    	symbol compatibility.
    	* stdio-common/Makefile [tests]: Add new tst-fmemopen3.
    	* stdio-common/psiginfo.c [psiginfo]: Call __fmemopen instead of
    	fmemopen.
    	* stdio-common/tst-fmemopen3.c: New file: more fmemopen tests, focus
    	on append and read mode.
    	* sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.22]: Add
    	fmemopen.
    	* sysdeps/unix/sysv/linux/alpha/libc.abilist [GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/arm/libc.abilist [GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/i386/libc.abilist [GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/ia64/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/microblaze/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/sh/libc.abilist [GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
    	[GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist [GLIBC_2.22]:
    	Likewise.
    	* sysdeps/unix/sysv/linux/hppa/libc.abilist [GLIBC_2.22]: Likewise.
    	* sysdeps/unix/sysv/linux/nios2/libc.abilist [GLIBC_2.22]: Likewise.

diff --git a/ChangeLog b/ChangeLog
index 0ed1cf3..1cf34d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,73 @@
+2015-07-08  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	[BZ #6544]
+	[BZ #11216]
+	[BZ #12836]
+	[BZ #13151]
+	[BZ #13152]
+	[BZ #14292]
+	* include/stdio.h (fmemopen): Remove hidden prototype.
+	(__fmemopen): Add new hidden prototype.
+	* libio/Makefile: Add oldfmemopen object.
+	* libio/Versions [GLIBC_2.22]: Add new fmemopen symbol.
+	* libio/fmemopen.c (__fmemopen): Function rewrite to be POSIX
+	compliance.
+	* libio/oldfmemopen.c: New file: old fmemopen implementation for
+	symbol compatibility.
+	* stdio-common/Makefile [tests]: Add new tst-fmemopen3.
+	* stdio-common/psiginfo.c [psiginfo]: Call __fmemopen instead of
+	fmemopen.
+	* stdio-common/tst-fmemopen3.c: New file: more fmemopen tests, focus
+	on append and read mode.
+	* sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.22]: Add
+	fmemopen.
+	* sysdeps/unix/sysv/linux/alpha/libc.abilist [GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/arm/libc.abilist [GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/i386/libc.abilist [GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/ia64/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/microblaze/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/sh/libc.abilist [GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
+	[GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist [GLIBC_2.22]:
+	Likewise.
+	* sysdeps/unix/sysv/linux/hppa/libc.abilist [GLIBC_2.22]: Likewise.
+	* sysdeps/unix/sysv/linux/nios2/libc.abilist [GLIBC_2.22]: Likewise.
+
 2015-07-08  Carlos O'Donell  <carlos@redhat.com>
 
 	[BZ #18643]
diff --git a/NEWS b/NEWS
index 23388ae..ae0b753 100644
--- a/NEWS
+++ b/NEWS
@@ -9,24 +9,25 @@ Version 2.22
 
 * The following bugs are resolved with this release:
 
-  438, 4719, 6792, 13028, 13064, 14094, 14841, 14906, 14958, 15319,
-  15467, 15790, 15969, 16159, 16339, 16350, 16351, 16352, 16353, 16361,
-  16512, 16526, 16538, 16559, 16560, 16704, 16783, 16850, 17053, 17090,
-  17195, 17269, 17293, 17322, 17403, 17523, 17542, 17569, 17581, 17588,
-  17596, 17620, 17621, 17628, 17631, 17692, 17711, 17715, 17776, 17779,
-  17792, 17833, 17836, 17841, 17912, 17916, 17930, 17932, 17944, 17949,
-  17964, 17965, 17967, 17969, 17977, 17978, 17987, 17991, 17996, 17998,
-  17999, 18007, 18019, 18020, 18029, 18030, 18032, 18034, 18036, 18038,
-  18039, 18042, 18043, 18046, 18047, 18049, 18068, 18080, 18093, 18100,
-  18104, 18110, 18111, 18116, 18125, 18128, 18138, 18185, 18196, 18197,
-  18206, 18210, 18211, 18217, 18219, 18220, 18221, 18234, 18244, 18245,
-  18247, 18287, 18319, 18324, 18333, 18346, 18371, 18397, 18409, 18410,
-  18412, 18418, 18422, 18434, 18435, 18444, 18468, 18469, 18470, 18479,
-  18483, 18495, 18496, 18497, 18498, 18502, 18507, 18508, 18512, 18513,
-  18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532, 18533, 18534,
-  18536, 18539, 18540, 18542, 18544, 18545, 18546, 18547, 18549, 18553,
-  18557, 18558, 18569, 18583, 18585, 18586, 18592, 18593, 18594, 18602,
-  18612, 18613, 18619, 18633, 18641, 18643.
+  438, 4719, 6544, 6792, 11216, 12836, 13028, 13064, 13151, 13152, 14094,
+  14292, 14841, 14906, 14958, 15319, 15467, 15790, 15969, 16159, 16339,
+  16350, 16351, 16352, 16353, 16361, 16512, 16526, 16538, 16559, 16560,
+  16704, 16783, 16850, 17053, 17090, 17195, 17269, 17293, 17322, 17403,
+  17523, 17542, 17569, 17581, 17588, 17596, 17620, 17621, 17628, 17631,
+  17692, 17711, 17715, 17776, 17779, 17792, 17833, 17836, 17841, 17912,
+  17916, 17930, 17932, 17944, 17949, 17964, 17965, 17967, 17969, 17977,
+  17978, 17987, 17991, 17996, 17998, 17999, 18007, 18019, 18020, 18029,
+  18030, 18032, 18034, 18036, 18038, 18039, 18042, 18043, 18046, 18047,
+  18049, 18068, 18080, 18093, 18100, 18104, 18110, 18111, 18116, 18125,
+  18128, 18138, 18185, 18196, 18197, 18206, 18210, 18211, 18217, 18219,
+  18220, 18221, 18234, 18244, 18245, 18247, 18287, 18319, 18324, 18333,
+  18346, 18371, 18397, 18409, 18410, 18412, 18418, 18422, 18434, 18435,
+  18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
+  18502, 18507, 18508, 18512, 18513, 18519, 18520, 18522, 18527, 18528,
+  18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540, 18542, 18544,
+  18545, 18546, 18547, 18549, 18553, 18557, 18558, 18569, 18583, 18585,
+  18586, 18592, 18593, 18594, 18602, 18612, 18613, 18619, 18633, 18641.
+  18643.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
@@ -65,6 +66,11 @@ Version 2.22
   Shared library libmvec.so is linked in as needed when using -lm (no need to
   specify -lmvec explicitly for not static builds).
   Visit <https://sourceware.org/glibc/wiki/libmvec> for detailed information.
+
+* A new fmemopen implementation has been added with the goal of POSIX
+  compliance. The new implementation fixes the following long-standing
+  issues: BZ#6544, BZ#11216, BZ#12836, BZ#13151, BZ#13152, and BZ#14292. The
+  old implementation is still present for use be by existing binaries.
 
 Version 2.21
 
diff --git a/include/stdio.h b/include/stdio.h
index 5e50e63..31718f9 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -197,6 +197,9 @@ gets (char *__str)
 }
 #  endif
 
+extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
+libc_hidden_proto (__fmemopen)
+
 __END_DECLS
 # endif
 
diff --git a/libio/Makefile b/libio/Makefile
index 097cfae..7b3bcf9 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -46,7 +46,7 @@ routines	:=							      \
 	__fbufsize __freading __fwriting __freadable __fwritable __flbf	      \
 	__fpurge __fpending __fsetlocking				      \
 									      \
-	libc_fatal fmemopen
+	libc_fatal fmemopen oldfmemopen
 
 tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc   \
 	tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-ext2 \
diff --git a/libio/Versions b/libio/Versions
index 8df89d2..2a1d6e6 100644
--- a/libio/Versions
+++ b/libio/Versions
@@ -148,6 +148,10 @@ libc {
   GLIBC_2.4 {
     open_wmemstream;
   }
+  GLIBC_2.22 {
+    # f*
+    fmemopen;
+  }
   GLIBC_PRIVATE {
     # Used by NPTL and librt
     __libc_fatal;
diff --git a/libio/fmemopen.c b/libio/fmemopen.c
index 06e5ab8..e6e6a49 100644
--- a/libio/fmemopen.c
+++ b/libio/fmemopen.c
@@ -1,7 +1,6 @@
-/* Fmemopen implementation.
-   Copyright (C) 2000-2015 Free Software Foundation, Inc.
+/* fmemopen implementation.
+   Copyright (C) 2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Hanno Mueller, kontakt@hanno.de, 2000.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -17,54 +16,10 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/*
- * fmemopen() - "my" version of a string stream
- * Hanno Mueller, kontakt@hanno.de
- *
- *
- * I needed fmemopen() for an application that I currently work on,
- * but couldn't find it in libio. The following snippet of code is an
- * attempt to implement what glibc's documentation describes.
- *
- *
- *
- * I already see some potential problems:
- *
- * - I never used the "original" fmemopen(). I am sure that "my"
- *   fmemopen() behaves differently than the original version.
- *
- * - The documentation doesn't say wether a string stream allows
- *   seeks. I checked the old fmemopen implementation in glibc's stdio
- *   directory, wasn't quite able to see what is going on in that
- *   source, but as far as I understand there was no seek there. For
- *   my application, I needed fseek() and ftell(), so it's here.
- *
- * - "append" mode and fseek(p, SEEK_END) have two different ideas
- *   about the "end" of the stream.
- *
- *   As described in the documentation, when opening the file in
- *   "append" mode, the position pointer will be set to the first null
- *   character of the string buffer (yet the buffer may already
- *   contain more data). For fseek(), the last byte of the buffer is
- *   used as the end of the stream.
- *
- * - It is unclear to me what the documentation tries to say when it
- *   explains what happens when you use fmemopen with a NULL
- *   buffer.
- *
- *   Quote: "fmemopen [then] allocates an array SIZE bytes long. This
- *   is really only useful if you are going to write things to the
- *   buffer and then read them back in again."
- *
- *   What does that mean if the original fmemopen() did not allow
- *   seeking? How do you read what you just wrote without seeking back
- *   to the beginning of the stream?
- *
- * - I think there should be a second version of fmemopen() that does
- *   not add null characters for each write. (At least in my
- *   application, I am not actually using strings but binary data and
- *   so I don't need the stream to add null characters on its own.)
- */
+/* fmemopen() from 2.22 and forward works as defined by POSIX.  It also
+   provides an older symbol, version 2.2.5, that behaves different regarding
+   SEEK_END (libio/oldfmemopen.c).  */
+
 
 #include <errno.h>
 #include <libio.h>
@@ -79,25 +34,23 @@
 typedef struct fmemopen_cookie_struct fmemopen_cookie_t;
 struct fmemopen_cookie_struct
 {
-  char *buffer;
-  int mybuffer;
-  int binmode;
-  size_t size;
-  _IO_off64_t pos;
-  size_t maxpos;
+  char        *buffer;   /* memory buffer.  */
+  int         mybuffer;  /* allocated my buffer?  */
+  int         append;    /* buffer open for append?  */
+  size_t      size;      /* buffer length in bytes.  */
+  _IO_off64_t pos;       /* current position at the buffer.  */
+  size_t      maxpos;    /* max position in buffer.  */
 };
 
 
 static ssize_t
 fmemopen_read (void *cookie, char *b, size_t s)
 {
-  fmemopen_cookie_t *c;
-
-  c = (fmemopen_cookie_t *) cookie;
+  fmemopen_cookie_t *c = (fmemopen_cookie_t *) cookie;
 
-  if (c->pos + s > c->size)
+  if (c->pos + s > c->maxpos)
     {
-      if ((size_t) c->pos == c->size)
+      if ((size_t) c->pos == c->maxpos)
 	return 0;
       s = c->size - c->pos;
     }
@@ -115,29 +68,28 @@ fmemopen_read (void *cookie, char *b, size_t s)
 static ssize_t
 fmemopen_write (void *cookie, const char *b, size_t s)
 {
-  fmemopen_cookie_t *c;
+  fmemopen_cookie_t *c = (fmemopen_cookie_t *) cookie;;
+  _IO_off64_t pos = c->append ? c->maxpos : c->pos;
   int addnullc;
 
-  c = (fmemopen_cookie_t *) cookie;
-
-  addnullc = c->binmode == 0 && (s == 0 || b[s - 1] != '\0');
+  addnullc = (s == 0 || b[s - 1] != '\0');
 
-  if (c->pos + s + addnullc > c->size)
+  if (pos + s + addnullc > c->size)
     {
       if ((size_t) (c->pos + addnullc) >= c->size)
 	{
 	  __set_errno (ENOSPC);
 	  return 0;
 	}
-      s = c->size - c->pos - addnullc;
+      s = c->size - pos - addnullc;
     }
 
-  memcpy (&(c->buffer[c->pos]), b, s);
+  memcpy (&(c->buffer[pos]), b, s);
 
-  c->pos += s;
-  if ((size_t) c->pos > c->maxpos)
+  pos += s;
+  if ((size_t) pos > c->maxpos)
     {
-      c->maxpos = c->pos;
+      c->maxpos = pos;
       if (addnullc)
 	c->buffer[c->maxpos] = '\0';
     }
@@ -150,9 +102,7 @@ static int
 fmemopen_seek (void *cookie, _IO_off64_t *p, int w)
 {
   _IO_off64_t np;
-  fmemopen_cookie_t *c;
-
-  c = (fmemopen_cookie_t *) cookie;
+  fmemopen_cookie_t *c = (fmemopen_cookie_t *) cookie;
 
   switch (w)
     {
@@ -165,7 +115,7 @@ fmemopen_seek (void *cookie, _IO_off64_t *p, int w)
       break;
 
     case SEEK_END:
-      np = (c->binmode ? c->size : c->maxpos) - *p;
+      np = c->maxpos + *p;
       break;
 
     default:
@@ -184,9 +134,7 @@ fmemopen_seek (void *cookie, _IO_off64_t *p, int w)
 static int
 fmemopen_close (void *cookie)
 {
-  fmemopen_cookie_t *c;
-
-  c = (fmemopen_cookie_t *) cookie;
+  fmemopen_cookie_t *c = (fmemopen_cookie_t *) cookie;
 
   if (c->mybuffer)
     free (c->buffer);
@@ -197,18 +145,11 @@ fmemopen_close (void *cookie)
 
 
 FILE *
-fmemopen (void *buf, size_t len, const char *mode)
+__fmemopen (void *buf, size_t len, const char *mode)
 {
   cookie_io_functions_t iof;
   fmemopen_cookie_t *c;
 
-  if (__glibc_unlikely (len == 0))
-    {
-    einval:
-      __set_errno (EINVAL);
-      return NULL;
-    }
-
   c = (fmemopen_cookie_t *) malloc (sizeof (fmemopen_cookie_t));
   if (c == NULL)
     return NULL;
@@ -231,26 +172,38 @@ fmemopen (void *buf, size_t len, const char *mode)
       if (__glibc_unlikely ((uintptr_t) len > -(uintptr_t) buf))
 	{
 	  free (c);
-	  goto einval;
+	  __set_errno (EINVAL);
+	  return NULL;
 	}
 
       c->buffer = buf;
 
-      if (mode[0] == 'w')
+      /* POSIX states that w+ mode should truncate the buffer.  */
+      if (mode[0] == 'w' && mode[1] == '+')
 	c->buffer[0] = '\0';
 
       c->maxpos = strnlen (c->buffer, len);
     }
 
+
+  /* Mode   |  starting position (cookie::pos) |          size (cookie::size)
+     ------ |----------------------------------|-----------------------------
+     read   |          beginning of the buffer |                size argument
+     write  |          beginning of the buffer |                         zero
+     append |    first null or size buffer + 1 |  first null or size argument
+   */
+
   c->size = len;
 
-  if (mode[0] == 'a')
+  if (mode[0] == 'r')
+    c->maxpos = len;
+
+  c->append = mode[0] == 'a';
+  if (c->append)
     c->pos = c->maxpos;
   else
     c->pos = 0;
 
-  c->binmode = mode[0] != '\0' && mode[1] == 'b';
-
   iof.read = fmemopen_read;
   iof.write = fmemopen_write;
   iof.seek = fmemopen_seek;
@@ -258,4 +211,5 @@ fmemopen (void *buf, size_t len, const char *mode)
 
   return _IO_fopencookie (c, mode, iof);
 }
-libc_hidden_def (fmemopen)
+libc_hidden_def (__fmemopen)
+versioned_symbol (libc, __fmemopen, fmemopen, GLIBC_2_22);
diff --git a/libio/fmemopen.c b/libio/oldfmemopen.c
similarity index 97%
copy from libio/fmemopen.c
copy to libio/oldfmemopen.c
index 06e5ab8..8e35672 100644
--- a/libio/fmemopen.c
+++ b/libio/oldfmemopen.c
@@ -66,6 +66,10 @@
  *   so I don't need the stream to add null characters on its own.)
  */
 
+#include "libioP.h"
+
+#if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_22)
+
 #include <errno.h>
 #include <libio.h>
 #include <stdio.h>
@@ -73,7 +77,6 @@
 #include <stdint.h>
 #include <string.h>
 #include <sys/types.h>
-#include "libioP.h"
 
 
 typedef struct fmemopen_cookie_struct fmemopen_cookie_t;
@@ -197,7 +200,7 @@ fmemopen_close (void *cookie)
 
 
 FILE *
-fmemopen (void *buf, size_t len, const char *mode)
+__old_fmemopen (void *buf, size_t len, const char *mode)
 {
   cookie_io_functions_t iof;
   fmemopen_cookie_t *c;
@@ -258,4 +261,5 @@ fmemopen (void *buf, size_t len, const char *mode)
 
   return _IO_fopencookie (c, mode, iof);
 }
-libc_hidden_def (fmemopen)
+compat_symbol (libc, __old_fmemopen, fmemopen, GLIBC_2_2);
+#endif
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 8567056..d0bf0e1 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -57,7 +57,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
 	 bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
 	 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
+	 bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 tst-fmemopen3
 
 test-srcs = tst-unbputc tst-printf
 
diff --git a/stdio-common/psiginfo.c b/stdio-common/psiginfo.c
index 3aff501..30847ea 100644
--- a/stdio-common/psiginfo.c
+++ b/stdio-common/psiginfo.c
@@ -60,7 +60,7 @@ void
 psiginfo (const siginfo_t *pinfo, const char *s)
 {
   char buf[512];
-  FILE *fp = fmemopen (buf, sizeof (buf), "w");
+  FILE *fp = __fmemopen (buf, sizeof (buf), "w");
   if (fp == NULL)
     {
       const char *colon;
diff --git a/stdio-common/tst-fmemopen3.c b/stdio-common/tst-fmemopen3.c
new file mode 100644
index 0000000..be48153
--- /dev/null
+++ b/stdio-common/tst-fmemopen3.c
@@ -0,0 +1,206 @@
+/* fmemopen tests for append and read mode.
+   Copyright (C) 2015 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>
+
+static void
+print_buffer (const char *s, size_t n)
+{
+  size_t i;
+  for (i=0; i<n; ++i)
+    printf ("0x%02X (%c), ", s[i], s[i]);
+}
+
+/* This test check append mode initial position (a/a+) based on POSIX defition
+   (BZ#6544 and BZ#13151).  */
+static int
+do_test_write_append (const char *mode)
+{
+  char buf[32] = "testing buffer";
+  char exp[32] = "testing bufferXX";
+
+  FILE *fp = fmemopen (buf, sizeof (buf), mode);
+
+  fflush (fp);
+  fprintf (fp, "X");
+  fseek (fp, 0, SEEK_SET);
+  fprintf (fp, "X");
+  fclose (fp);
+
+  if (strcmp (buf, exp) != 0)
+    {
+      printf ("%s: check failed: %s != %s\n", __FUNCTION__, buf, exp);
+      return 1;
+    }
+
+  return 0;
+}
+
+/* This test check append mode initial position (a/a+) based on POSIX defition
+   (BZ#6544 and BZ#13151) for buffer without null byte end.  */
+static int
+do_test_write_append_without_null (const char *mode)
+{
+  char buf[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
+  char exp[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
+
+  /* If '\0' is not found in buffer, POSIX states that SEEK_SET should be
+     the size argument.  */
+  FILE *fp = fmemopen (buf, sizeof (buf) - 2, "a");
+
+  fflush (fp);
+  fputc (0x70, fp);
+  fseek (fp, 0, SEEK_SET);
+  fputc (0x70, fp);
+  fputc (0x70, fp);
+  fclose (fp);
+
+  /* POSIX also states that a write operation on the stream shall not advance
+     the current buffer size beyond the size given in fmemopen, so the string
+     should be same.  */
+  if (memcmp (buf, exp, sizeof (buf)) != 0)
+    {
+      printf ("%s: check failed: ", __FUNCTION__);
+      print_buffer (buf, sizeof (buf));
+      printf ("!= ");
+      print_buffer (exp, sizeof (exp));
+      printf ("\n");
+      return 1;
+    }
+
+  return 0;
+}
+
+/* This test check for initial position and feek value for fmemopen objects
+   opened with append mode.  */
+static int
+do_test_read_append (void)
+{
+  char buf[32] = "testing buffer";
+  size_t buflen = strlen (buf);
+  long fpos;
+
+  /* POSIX defines for 'a+' the initial position is the first null byte.  */
+  FILE *fp = fmemopen (buf, sizeof (buf), "a+");
+
+  fpos = ftell (fp);
+  if (fpos != buflen)
+    {
+      printf ("%s: ftell|SEEK_SET (fp) %li != strlen (%s) %zu\n",
+	      __FUNCTION__, fpos, buf, buflen);
+      fclose (fp);
+      return 1;
+    }
+
+  fseek (fp, 0, SEEK_END);
+
+  if (fpos != buflen)
+    {
+      printf ("%s: ftell|SEEK_END (fp) %li != strlen (%s) %zu\n",
+	      __FUNCTION__, fpos, buf, buflen);
+      fclose (fp);
+      return 1;
+    }
+  fclose (fp);
+
+  /* Check if attempting to read past the current size, defined as strlen (buf)
+     yield an EOF.  */
+  fp = fmemopen (buf, sizeof (buf), "a+");
+  if (getc(fp) != EOF)
+    {
+      printf ("%s: getc(fp) != EOF\n", __FUNCTION__);
+      fclose (fp);
+      return -1;
+    }
+
+  fclose (fp);
+
+  return 0;
+}
+
+/* This test check for fseek (SEEK_END) using negative offsets (BZ#14292).  The
+   starting position of descriptor is different base on the opening mode.  */
+static int
+do_test_read_seek_neg (const char *mode, const char *expected)
+{
+  char buf[] = "abcdefghijklmnopqrstuvxz0123456789";
+  char tmp[10];
+  size_t tmps = sizeof (tmps);
+  long offset = -11;
+
+  FILE *fp = fmemopen (buf, sizeof (buf), mode);
+  fseek (fp, offset, SEEK_END);
+  fread (tmp, tmps, 1, fp);
+
+  if (memcmp (tmp, expected, tmps) != 0)
+    {
+      printf ("%s: fmemopen(%s) - fseek (fp, %li, SEEK_END):\n",
+	      __FUNCTION__, mode, offset);
+      printf ("  returned: ");
+      print_buffer (tmp, tmps);
+      printf ("\n");
+      printf ("  expected: ");
+      print_buffer (expected, tmps);
+      printf ("\n");
+      return 1;
+    }
+
+  fclose (fp);
+
+  return 0;
+}
+
+static int
+do_test_read_seek_negative (void)
+{
+  int ret = 0;
+
+  /* 'r' and 'w' modes defines the initial position at the buffer start and
+     seek with SEEK_END shall seek relative to its size give in fmemopen
+     call.  The expected tmp result is 0 to 9 *without* the ending null  */
+  ret += do_test_read_seek_neg ("r", "0123456789");
+  /* 'a+' mode sets the initial position at the first null byte in buffer and
+    SEEK_END shall seek relative to its size as well.  The expected result is
+    z012345678, since SEEK_END plus a+ start at '\0', not size.  */
+  ret += do_test_read_seek_neg ("a+", "z012345678");
+
+  return ret;
+}
+
+static int
+do_test (void)
+{
+  int ret = 0;
+
+  ret += do_test_write_append ("a");
+  ret += do_test_write_append_without_null ("a");
+  ret += do_test_write_append ("a+");
+  ret += do_test_write_append_without_null ("a+");
+
+  ret += do_test_read_append ();
+
+  ret += do_test_read_seek_negative ();
+
+  return ret;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index aeee312..3e0f329 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2081,3 +2081,6 @@ GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
  _mcount F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 980e088..58c8b32 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -1822,6 +1822,9 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.2
  GLIBC_2.2 A
  _IO_adjust_wcolumn F
diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
index ce45208..f2b20ad 100644
--- a/sysdeps/unix/sysv/linux/arm/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
@@ -89,6 +89,9 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.4
  GLIBC_2.4 A
  _Exit F
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 58407fc..cf0ad90 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -95,6 +95,9 @@ GLIBC_2.18
 GLIBC_2.19
  GLIBC_2.19 A
  fanotify_mark F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.2
  GLIBC_2.2 A
  _Exit F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 3cb314d..fcf1b72 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2023,6 +2023,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 067552d..16c2e3d 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1881,6 +1881,9 @@ GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
  getunwind F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index f06cc8e..902b0c3 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -90,6 +90,9 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.4
  GLIBC_2.4 A
  _Exit F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 9010ea7..4db00b0 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -1979,6 +1979,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
index 6e8d993..f1f76a1 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
@@ -2080,3 +2080,6 @@ GLIBC_2.18
  xencrypt F
  xprt_register F
  xprt_unregister F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 1c3490c..2d51989 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -1951,6 +1951,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index d8fd823..b012bdf 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -1949,6 +1949,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 3e6ed35..9db0e8b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -1947,6 +1947,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index c7e46aa..eecfcfe 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -1941,6 +1941,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index 0703418..b10bf62 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2121,3 +2121,6 @@ GLIBC_2.21
  xencrypt F
  xprt_register F
  xprt_unregister F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index f27b48b..0f15463 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -1983,6 +1983,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index a54382e..7bcaa07 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -1989,6 +1989,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
index 195b587..e58a00d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
@@ -90,6 +90,9 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  _Exit F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 0194f0b..0ce7824 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -1984,6 +1984,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 807f702..dc79912 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1880,6 +1880,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
index a653292..9ed1b45 100644
--- a/sysdeps/unix/sysv/linux/sh/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
@@ -1864,6 +1864,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 9defbdf..5a40ff3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -1975,6 +1975,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 35987fa..fa70645 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1908,6 +1908,9 @@ GLIBC_2.2.4
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
index caf74b8..dd215d7 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist
@@ -2091,3 +2091,6 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
index 68d975b..ef4747a 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist
@@ -2091,3 +2091,6 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
index caf74b8..dd215d7 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist
@@ -2091,3 +2091,6 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 914b590..b377b04 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1854,6 +1854,9 @@ GLIBC_2.2.5
 GLIBC_2.2.6
  GLIBC_2.2.6 A
  __nanosleep F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F
 GLIBC_2.3
  GLIBC_2.3 A
  __ctype_b_loc F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 0f64c8d..5f70329 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2089,3 +2089,6 @@ GLIBC_2.17
 GLIBC_2.18
  GLIBC_2.18 A
  __cxa_thread_atexit_impl F
+GLIBC_2.22
+ GLIBC_2.22 A
+ fmemopen F

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

Summary of changes:
 ChangeLog                                          |   75 +++++++
 NEWS                                               |   42 ++--
 include/stdio.h                                    |    3 +
 libio/Makefile                                     |    2 +-
 libio/Versions                                     |    4 +
 libio/fmemopen.c                                   |  140 ++++--------
 libio/{fmemopen.c => oldfmemopen.c}                |   10 +-
 stdio-common/Makefile                              |    2 +-
 stdio-common/psiginfo.c                            |    2 +-
 stdio-common/tst-fmemopen2.c                       |  220 ++++++++++++++++++--
 stdio-common/tst-fmemopen3.c                       |  206 ++++++++++++++++++
 sysdeps/unix/sysv/linux/aarch64/libc.abilist       |    3 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist         |    3 +
 sysdeps/unix/sysv/linux/arm/libc.abilist           |    3 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist          |    3 +
 sysdeps/unix/sysv/linux/i386/libc.abilist          |    3 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist          |    3 +
 sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |    3 +
 sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |    3 +
 sysdeps/unix/sysv/linux/microblaze/libc.abilist    |    3 +
 .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |    3 +
 .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |    3 +
 .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |    3 +
 .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |    3 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist         |    3 +
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |    3 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |    3 +
 .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |    3 +
 sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |    3 +
 sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |    3 +
 sysdeps/unix/sysv/linux/sh/libc.abilist            |    3 +
 sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |    3 +
 sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |    3 +
 .../sysv/linux/tile/tilegx/tilegx32/libc.abilist   |    3 +
 .../sysv/linux/tile/tilegx/tilegx64/libc.abilist   |    3 +
 sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist  |    3 +
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |    3 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |    3 +
 38 files changed, 653 insertions(+), 134 deletions(-)
 copy libio/{fmemopen.c => oldfmemopen.c} (97%)
 create mode 100644 stdio-common/tst-fmemopen3.c


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]