mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
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 <carlos@redhat.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@@ -15,29 +15,11 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <libintl.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* 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 <locale/localeinfo.h>
|
||||
|
||||
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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user