From 28aff047818eb1726394296d27b9c7885340bead Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 14 May 2020 17:44:15 -0300 Subject: string: Implement strerror in terms of strerror_l If the thread is terminated then __libc_thread_freeres will free the storage via __glibc_tls_internal_free. It is only within the calling thread that this matters. It makes strerror MT-safe. Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, and s390x-linux-gnu. Tested-by: Carlos O'Donell Reviewed-by: Carlos O'Donell --- string/strerror.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) (limited to 'string/strerror.c') diff --git a/string/strerror.c b/string/strerror.c index 283ab70..35c7490 100644 --- a/string/strerror.c +++ b/string/strerror.c @@ -15,29 +15,11 @@ License along with the GNU C Library; if not, see . */ -#include -#include #include -#include - -/* Return a string describing the errno code in ERRNUM. - The storage is good only until the next call to strerror. - Writing to the storage causes undefined behavior. */ -libc_freeres_ptr (static char *buf); +#include char * strerror (int errnum) { - char *ret = __strerror_r (errnum, NULL, 0); - int saved_errno; - - if (__glibc_likely (ret != NULL)) - return ret; - saved_errno = errno; - if (buf == NULL) - buf = malloc (1024); - __set_errno (saved_errno); - if (buf == NULL) - return _("Unknown error"); - return __strerror_r (errnum, buf, 1024); + return __strerror_l (errnum, __libc_tsd_get (locale_t, LOCALE)); } -- cgit v1.1