From 01ac385ca819599f7f1815115ffe926b5e1460ef Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 7 Jul 2020 21:46:53 +0000 Subject: hurd: Fix strerror not setting errno * sysdeps/mach/strerror_l.c: Include . (__strerror_l): Save errno on entry and restore it on exit. --- sysdeps/mach/strerror_l.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/mach/strerror_l.c b/sysdeps/mach/strerror_l.c index 72b857f4a0..dacb7e4d95 100644 --- a/sysdeps/mach/strerror_l.c +++ b/sysdeps/mach/strerror_l.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,8 @@ translate (const char *str, locale_t loc) char * __strerror_l (int errnum, locale_t loc) { + int saved_errno = errno; + char *err; int system; int sub; int code; @@ -61,15 +64,15 @@ __strerror_l (int errnum, locale_t loc) errnum) == -1) tls_internal->strerror_l_buf = NULL; + __set_errno (saved_errno); return tls_internal->strerror_l_buf; } es = &__mach_error_systems[system]; if (sub >= es->max_sub) - return (char *) translate (es->bad_sub, loc); - - if (code >= es->subsystem[sub].max_code) + err = (char *) translate (es->bad_sub, loc); + else if (code >= es->subsystem[sub].max_code) { struct tls_internal_t *tls_internal = __glibc_tls_internal (); free (tls_internal->strerror_l_buf); @@ -79,10 +82,13 @@ __strerror_l (int errnum, locale_t loc) errnum) == -1) tls_internal->strerror_l_buf = NULL; - return tls_internal->strerror_l_buf; + err = tls_internal->strerror_l_buf; } + else + err = (char *) translate (es->subsystem[sub].codes[code], loc); - return (char *) translate (es->subsystem[sub].codes[code], loc); + __set_errno (saved_errno); + return err; } weak_alias (__strerror_l, strerror_l) libc_hidden_def (__strerror_l) -- cgit 1.4.1