diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-07-07 21:46:53 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-07-07 21:46:53 +0000 |
commit | 01ac385ca819599f7f1815115ffe926b5e1460ef (patch) | |
tree | 17ef74f8e3f0b74fcf5da0541c173c329273c1a7 | |
parent | 5549370a73c45b12621a1abe58920771278a72b4 (diff) | |
download | glibc-01ac385ca819599f7f1815115ffe926b5e1460ef.tar glibc-01ac385ca819599f7f1815115ffe926b5e1460ef.tar.gz glibc-01ac385ca819599f7f1815115ffe926b5e1460ef.tar.bz2 glibc-01ac385ca819599f7f1815115ffe926b5e1460ef.zip |
hurd: Fix strerror not setting errno
* sysdeps/mach/strerror_l.c: Include <errno.h>.
(__strerror_l): Save errno on entry and restore it on exit.
-rw-r--r-- | sysdeps/mach/strerror_l.c | 16 |
1 files changed, 11 insertions, 5 deletions
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 <stdio.h> #include <stdlib.h> #include <string.h> +#include <errno.h> #include <mach/error.h> #include <errorlib.h> #include <tls-internal.h> @@ -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) |