]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Always fill output buffer in XPG strerror function
authorUlrich Drepper <drepper@gmail.com>
Sat, 21 May 2011 16:11:36 +0000 (12:11 -0400)
committerUlrich Drepper <drepper@gmail.com>
Sat, 21 May 2011 16:11:36 +0000 (12:11 -0400)
ChangeLog
NEWS
string/xpg-strerror.c

index fc2b7a8283aabd08f14c3aea743f43befadda352..bc73ba35bc443340802dd8cf838f2a37304f9517 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-05-21  Ulrich Drepper  <drepper@gmail.com>
 
+       [BZ #12782]
+       * string/xpg-strerror.c (__xpg_strerror_r): Fill buffer even if error
+       is returned.
+
        * string/_strerror.c (__strerror_r): Print negative errors as signed
        numbers.
 
diff --git a/NEWS b/NEWS
index a99c74a041a6a0985d7a844446f8836a1f4e5345..90ccee7df82a9ac7a56ee7a4999bb3f4b1cbd719 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,8 +16,8 @@ Version 2.14
   12454, 12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541,
   12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626,
   12631, 12650, 12653, 12655, 12660, 12681, 12685, 12711, 12713, 12714,
-  12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12777, 12788,
-  12792
+  12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12777, 12782,
+  12788, 12792
 
 * The RPC implementation in libc is obsoleted.  Old programs keep working
   but new programs cannot be linked with the routines in libc anymore.
index 8d898122d1f1ec3b7a1b61471eef8fd739c21729..00256c3dac2591e99b504c97b05945e27aefecce 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2002, 2004, 2010
+/* Copyright (C) 1991, 1993, 1995-1998, 2000, 2002, 2004, 2010, 2011
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -17,6 +17,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <assert.h>
 #include <errno.h>
 #include <libintl.h>
 #include <stdio.h>
 int
 __xpg_strerror_r (int errnum, char *buf, size_t buflen)
 {
+  const char *estr = __strerror_r (errnum, buf, buflen);
+  size_t estrlen = strlen (estr);
+
   if (errnum < 0 || errnum >= _sys_nerr_internal
       || _sys_errlist_internal[errnum] == NULL)
     return EINVAL;
 
-  const char *estr = (const char *) _(_sys_errlist_internal[errnum]);
-  size_t estrlen = strlen (estr) + 1;
-
-  if (buflen < estrlen)
-    return ERANGE;
+  assert (estr != buf);
+/* Terminate the string in any case.  */
+  *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0';
 
-  memcpy (buf, estr, estrlen);
-  return 0;
+  return buflen <= estrlen ? ERANGE : 0;
 }