diff options
author | 2012-12-27 Bruno Haible <bruno@clisp.org> | 2012-12-27 22:37:39 +0100 |
---|---|---|
committer | Andreas Jaeger <aj@suse.de> | 2012-12-27 22:37:39 +0100 |
commit | 7fffbdfff7d39cec0783e5b9381fa4093484c235 (patch) | |
tree | fba3a354f4eafa41e26f844db6dfa6c18476a9b1 | |
parent | 9c7595bda2c37b31e82dab424bfd3015664b176d (diff) | |
download | glibc-7fffbdfff7d39cec0783e5b9381fa4093484c235.tar.gz glibc-7fffbdfff7d39cec0783e5b9381fa4093484c235.tar.xz glibc-7fffbdfff7d39cec0783e5b9381fa4093484c235.zip |
BZ#14317: Optimze __xpg_strerror_r
[BZ #14317] * string/xpg-strerror.c (__xpg_strerror_r): Optimize, call strlen only if needed.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | string/xpg-strerror.c | 24 |
3 files changed, 23 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index 2a9a361266..879fe2d3e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-12-27 Bruno Haible <bruno@clisp.org> + + [BZ #14317] + * string/xpg-strerror.c (__xpg_strerror_r): Optimize, call strlen + only if needed. + 2012-12-27 Siddhesh Poyarekar <siddhesh@redhat.com> * sysdeps/ieee754/dbl-64/mpexp.c (__mpexp): Eliminate __mpexp_nn diff --git a/NEWS b/NEWS index c00b55588c..bae3e41d8a 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ Version 2.18 * The following bugs are resolved with this release: + 14317. + Version 2.17 diff --git a/string/xpg-strerror.c b/string/xpg-strerror.c index 7e46b33183..73600fb6a2 100644 --- a/string/xpg-strerror.c +++ b/string/xpg-strerror.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1991, 1993, 1995-1998, 2000, 2002, 2004, 2010, 2011 - Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 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 @@ -28,20 +27,27 @@ int __xpg_strerror_r (int errnum, char *buf, size_t buflen) { const char *estr = __strerror_r (errnum, buf, buflen); - size_t estrlen = strlen (estr); + /* We know that __strerror_r returns buf (with a dynamically computed + string) if errnum is invalid, otherwise it returns a string whose + storage has indefinite extent. */ if (estr == buf) { assert (errnum < 0 || errnum >= _sys_nerr_internal || _sys_errlist_internal[errnum] == NULL); return EINVAL; } - assert (errnum >= 0 && errnum < _sys_nerr_internal - && _sys_errlist_internal[errnum] != NULL); + else + { + assert (errnum >= 0 && errnum < _sys_nerr_internal + && _sys_errlist_internal[errnum] != NULL); + + size_t estrlen = strlen (estr); - /* Terminate the string in any case. */ - if (buflen > 0) - *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0'; + /* Terminate the string in any case. */ + if (buflen > 0) + *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0'; - return buflen <= estrlen ? ERANGE : 0; + return buflen <= estrlen ? ERANGE : 0; + } } |