From: Ulrich Drepper Date: Sat, 21 May 2011 16:11:36 +0000 (-0400) Subject: Always fill output buffer in XPG strerror function X-Git-Tag: glibc-2.14~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7ea72f99966a65a56aedba817ee2413ff9b1f23c;p=thirdparty%2Fglibc.git Always fill output buffer in XPG strerror function --- diff --git a/ChangeLog b/ChangeLog index fc2b7a8283a..bc73ba35bc4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-05-21 Ulrich Drepper + [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 a99c74a041a..90ccee7df82 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 8d898122d1f..00256c3dac2 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 #include #include #include @@ -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; }