about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-05-21 12:11:36 -0400
committerUlrich Drepper <drepper@gmail.com>2011-05-21 12:11:36 -0400
commit7ea72f99966a65a56aedba817ee2413ff9b1f23c (patch)
treeb5e30f57554d3999654fff7fc2223dffc4d167fb
parent7e4afad5bcf49e03c3b987399c6a8f66a9018660 (diff)
downloadglibc-7ea72f99966a65a56aedba817ee2413ff9b1f23c.tar.gz
glibc-7ea72f99966a65a56aedba817ee2413ff9b1f23c.tar.xz
glibc-7ea72f99966a65a56aedba817ee2413ff9b1f23c.zip
Always fill output buffer in XPG strerror function
-rw-r--r--ChangeLog4
-rw-r--r--NEWS4
-rw-r--r--string/xpg-strerror.c17
3 files changed, 15 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index fc2b7a8283..bc73ba35bc 100644
--- 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 a99c74a041..90ccee7df8 100644
--- 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.
diff --git a/string/xpg-strerror.c b/string/xpg-strerror.c
index 8d898122d1..00256c3dac 100644
--- a/string/xpg-strerror.c
+++ b/string/xpg-strerror.c
@@ -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>
@@ -37,16 +38,16 @@
 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;
 }