[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