diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-07-02 11:27:51 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-07-02 11:27:51 +0000 |
commit | efdb85183aca7634d61a413c55d63e519d89d162 (patch) | |
tree | a9134f4319213e2b30a6bc078ab7bb4a501db9bb /sysdeps | |
parent | 181e991dfb800f721b693fe1a2227f736b99e725 (diff) | |
download | glibc-efdb85183aca7634d61a413c55d63e519d89d162.tar.gz glibc-efdb85183aca7634d61a413c55d63e519d89d162.tar.xz glibc-efdb85183aca7634d61a413c55d63e519d89d162.zip |
mach: strerror must not return NULL (bug 30555)
This follows 1d44530a5be2 ("string: strerror must not return NULL (bug 30555)"): « For strerror, this fixes commit 28aff047818eb1726394296d27b ("string: Implement strerror in terms of strerror_l"). This commit avoids returning NULL for strerror_l as well, although POSIX allows this behavior for strerror_l. »
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/mach/strerror_l.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/sysdeps/mach/strerror_l.c b/sysdeps/mach/strerror_l.c index 412e38ba52..6555185da7 100644 --- a/sysdeps/mach/strerror_l.c +++ b/sysdeps/mach/strerror_l.c @@ -61,11 +61,18 @@ __strerror_l (int errnum, locale_t loc) free (tls_internal->strerror_l_buf); if (__asprintf (&tls_internal->strerror_l_buf, "%s%X", translate ("Error in unknown error system: ", loc), - errnum) == -1) - tls_internal->strerror_l_buf = NULL; + errnum) > 0) + err = tls_internal->strerror_l_buf; + else + { + /* The memory was freed above. */ + tls_internal->strerror_l_buf = NULL; + /* Provide a fallback translation. */ + err = (char *) translate ("Unknown error", loc); + } __set_errno (saved_errno); - return tls_internal->strerror_l_buf; + return err; } es = &__mach_error_systems[system]; @@ -79,10 +86,15 @@ __strerror_l (int errnum, locale_t loc) if (__asprintf (&tls_internal->strerror_l_buf, "%s%s %d", translate ("Unknown error ", loc), translate (es->subsystem[sub].subsys_name, loc), - errnum) == -1) - tls_internal->strerror_l_buf = NULL; - - err = tls_internal->strerror_l_buf; + errnum) > 0) + err = tls_internal->strerror_l_buf; + else + { + /* The memory was freed above. */ + tls_internal->strerror_l_buf = NULL; + /* Provide a fallback translation. */ + err = (char *) translate ("Unknown error", loc); + } } else err = (char *) translate (es->subsystem[sub].codes[code], loc); |