[RFC 3/4] string: Make strerror async-signal-safe
Andreas Schwab
schwab@linux-m68k.org
Thu May 14 07:12:58 GMT 2020
On Mai 13 2020, Adhemerval Zanella via Libc-alpha wrote:
> +char *
> +__strerror_lookup (int errnum)
> +{
> + if (__glibc_unlikely (errnum < 0 || errnum >= _sys_nerr_internal))
> + return NULL;
> + return (char *) _sys_errlist_internal[errnum];
> +}
>
> /* Return a string describing the errno code in ERRNUM. */
> char *
> __strerror_r (int errnum, char *buf, size_t buflen)
> {
> - if (__glibc_unlikely (errnum < 0 || errnum >= _sys_nerr_internal
> - || _sys_errlist_internal[errnum] == NULL))
> - {
> - /* Buffer we use to print the number in. For a maximum size for
> - `int' of 8 bytes we never need more than 20 digits. */
> - char numbuf[21];
> - const char *unk = _("Unknown error ");
> - size_t unklen = strlen (unk);
> - char *p, *q;
> - bool negative = errnum < 0;
> + char *r = __strerror_lookup (errnum);
> + if (r != NULL)
> + return r;
>
> - numbuf[20] = '\0';
> - p = _itoa_word (abs (errnum), &numbuf[20], 10, 0);
> + const size_t unklen = array_length (UNK_ERR_STR) - 1;
> + char *q = __mempcpy (buf, UNK_ERR_STR, MIN (buflen, unklen));
> + if (unklen < buflen)
> + {
> + char numstr[INT_STRLEN_BOUND (int) + 1];
> + size_t numstrlen = 1;
>
> - /* Now construct the result while taking care for the destination
> - buffer size. */
> - q = __mempcpy (buf, unk, MIN (unklen, buflen));
> - if (negative && unklen < buflen)
> + char *p = numstr;
> + long int errn = errnum;
Why long int?
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
More information about the Libc-alpha
mailing list