]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
string: Simplify strerror_r
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 14 May 2020 21:14:43 +0000 (18:14 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 7 Jul 2020 17:10:58 +0000 (14:10 -0300)
Use snprintf instead of mempcpy plus itoa_word and remove unused
definitions.  There is no potential for infinite recursion because
snprintf only use strerror_r for the %m specifier.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
string/_strerror.c
sysdeps/mach/_strerror.c

index 01226e3d4b4069c54a9250cd39032a43fa3f4985..da3b22f5b193bb0e621ed1c361aff5eeb4d14c20 100644 (file)
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <string.h>
 #include <libintl.h>
-#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <_itoa.h>
-
-/* It is critical here that we always use the `dcgettext' function for
-   the message translation.  Since <libintl.h> only defines the macro
-   `dgettext' to use `dcgettext' for optimizing programs this is not
-   always guaranteed.  */
-#ifndef dgettext
-# include <locale.h>           /* We need LC_MESSAGES.  */
-# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES)
-#endif
 
 /* Return a string describing the errno code in ERRNUM.  */
 char *
@@ -39,32 +27,7 @@ __strerror_r (int errnum, char *buf, size_t buflen)
   char *err = (char *) __get_errlist (errnum);
   if (__glibc_unlikely (err == 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;
-
-      numbuf[20] = '\0';
-      p = _itoa_word (abs (errnum), &numbuf[20], 10, 0);
-
-      /* Now construct the result while taking care for the destination
-        buffer size.  */
-      q = __mempcpy (buf, unk, MIN (unklen, buflen));
-      if (negative && unklen < buflen)
-       {
-         *q++ = '-';
-         ++unklen;
-       }
-      if (unklen < buflen)
-       memcpy (q, p, MIN ((size_t) (&numbuf[21] - p), buflen - unklen));
-
-      /* Terminate the string in any case.  */
-      if (buflen > 0)
-       buf[buflen - 1] = '\0';
-
+      __snprintf (buf, buflen, "%s%d", _("Unknown error "), errnum);
       return buf;
     }
 
index d932b1bd5864e868b5aeb45a18667cd0955517b5..399de330d9b6af9565597c33eef7cf32bc3a2b78 100644 (file)
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <string.h>
 #include <libintl.h>
 #include <stdio.h>
 #include <string.h>
 #include <mach/error.h>
 #include <errorlib.h>
-#include <sys/param.h>
-#include <_itoa.h>
-
-/* It is critical here that we always use the `dcgettext' function for
-   the message translation.  Since <libintl.h> only defines the macro
-   `dgettext' to use `dcgettext' for optimizing programs this is not
-   always guaranteed.  */
-#ifndef dgettext
-# include <locale.h>           /* We need LC_MESSAGES.  */
-# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES)
-#endif
 
 /* Return a string describing the errno code in ERRNUM.  */
 char *
@@ -50,26 +40,8 @@ __strerror_r (int errnum, char *buf, size_t buflen)
 
   if (system > err_max_system || ! __mach_error_systems[system].bad_sub)
     {
-      /* 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 = _("Error in unknown error system: ");
-      const size_t unklen = strlen (unk);
-      char *p, *q;
-
-      numbuf[20] = '\0';
-      p = _itoa_word (errnum, &numbuf[20], 16, 1);
-
-      /* Now construct the result while taking care for the destination
-        buffer size.  */
-      q = __mempcpy (buf, unk, MIN (unklen, buflen));
-      if (unklen < buflen)
-       memcpy (q, p, MIN (&numbuf[21] - p, buflen - unklen));
-
-      /* Terminate the string in any case.  */
-      if (buflen > 0)
-       buf[buflen - 1] = '\0';
-
+      __snprintf (buf, buflen, "%s: %d", _("Error in unknown error system: "),
+                 errnum);
       return buf;
     }
 
@@ -80,37 +52,8 @@ __strerror_r (int errnum, char *buf, size_t buflen)
 
   if (code >= es->subsystem[sub].max_code)
     {
-      /* 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 ");
-      const size_t unklen = strlen (unk);
-      char *p, *q;
-      size_t len = strlen (es->subsystem[sub].subsys_name);
-
-      numbuf[20] = '\0';
-      p = _itoa_word (errnum, &numbuf[20], 10, 0);
-
-      /* Now construct the result while taking care for the destination
-        buffer size.  */
-      q = __mempcpy (buf, unk, MIN (unklen, buflen));
-      if (unklen < buflen)
-       {
-         q = __mempcpy (q, es->subsystem[sub].subsys_name,
-                        MIN (len, buflen - unklen));
-         if (unklen + len < buflen)
-           {
-             *q++ = ' ';
-             if (unklen + len + 1 < buflen)
-               memcpy (q, p,
-                       MIN (&numbuf[21] - p, buflen - unklen - len - 1));
-           }
-       }
-
-       /* Terminate the string in any case.  */
-      if (buflen > 0)
-       buf[buflen - 1] = '\0';
-
+      __snprintf (buf, buflen, "%s%s %d", _("Unknown error "),
+                 es->subsystem[sub].subsys_name, errnum);
       return buf;
     }