Replace the remaining uses of strerror with safe_strerror
authorChristian Biesinger <cbiesinger@google.com>
Wed, 6 Nov 2019 19:57:52 +0000 (13:57 -0600)
committerChristian Biesinger <cbiesinger@google.com>
Tue, 10 Dec 2019 19:23:01 +0000 (13:23 -0600)
To do that, this patch makes IPA compile safe-strerror as well. Because
it doesn't use Gnulib, it calls the Glibc version of strerror_r directly.

Consequently this patch also removes the configure checks for strerror.

gdb/ChangeLog:

2019-12-10  Christian Biesinger  <cbiesinger@google.com>

* config.in: Regenerate.
* configure: Regenerate.
* gdbsupport/agent.c (gdb_connect_sync_socket): Call
safe_strerror instead of strerror.
* gdbsupport/common.m4: Don't check for strerror.
* gdbsupport/safe-strerror.c: Support both the glibc version
of strerror_r and the XSI version.

gdb/gdbserver/ChangeLog:

2019-12-10  Christian Biesinger  <cbiesinger@google.com>

* Makefile.in: Add safe-strerror.c to gdbreplay and IPA, and change
UNDO_GNULIB_CFLAGS to undo strerror_r instead of strerror.
* config.in: Regenerate.
* configure: Regenerate.
* configure.ac: Don't check for strerror.
* linux-i386-ipa.c (initialize_fast_tracepoint_trampoline_buffer):
Call safe_strerror instead of strerror.
* server.h (strerror): Remove this now-unnecessary declaration.
* tracepoint.c (init_named_socket): Call safe_strerror instead of
strerror.
(gdb_agent_helper_thread): Likewise.
* utils.c (perror_with_name): Likewise.

Change-Id: I74848f072dcde75cb55c435ef9398dc8f958cd73

15 files changed:
gdb/ChangeLog
gdb/config.in
gdb/configure
gdb/gdbserver/ChangeLog
gdb/gdbserver/Makefile.in
gdb/gdbserver/config.in
gdb/gdbserver/configure
gdb/gdbserver/configure.ac
gdb/gdbserver/linux-i386-ipa.c
gdb/gdbserver/server.h
gdb/gdbserver/tracepoint.c
gdb/gdbserver/utils.c
gdb/gdbsupport/agent.c
gdb/gdbsupport/common.m4
gdb/gdbsupport/safe-strerror.c

index ac58517ce17f8fd835cbc191430fc40e3007474d..a6e299d905311be670c093bc8b82b515cb1d2309 100644 (file)
@@ -1,3 +1,13 @@
+2019-12-10  Christian Biesinger  <cbiesinger@google.com>
+
+       * config.in: Regenerate.
+       * configure: Regenerate.
+       * gdbsupport/agent.c (gdb_connect_sync_socket): Call
+       safe_strerror instead of strerror.
+       * gdbsupport/common.m4: Don't check for strerror.
+       * gdbsupport/safe-strerror.c: Support both the glibc version
+       of strerror_r and the XSI version.
+
 2019-12-10  Tom Tromey  <tromey@adacore.com>
 
        * ada-typeprint.c (print_choices): Use a single "?".
index 1caf76481b9dddfbdca8c53fb87840a1d0f146e2..cb886ba8e1a91890b4d8cda5d0fcd8d02a1ea77e 100644 (file)
    don't. */
 #undef HAVE_DECL_SNPRINTF
 
-/* Define to 1 if you have the declaration of `strerror', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRERROR
-
 /* Define to 1 if you have the declaration of `strstr', and to 0 if you don't.
    */
 #undef HAVE_DECL_STRSTR
index 6b64619df7a932155cb70d3a14cd273fff20198a..324eb509440881d59fba79d9effe2ef74893d17e 100755 (executable)
 done
 
 
-  ac_fn_c_check_decl "$LINENO" "strerror" "ac_cv_have_decl_strerror" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR $ac_have_decl
-_ACEOF
-ac_fn_c_check_decl "$LINENO" "strstr" "ac_cv_have_decl_strstr" "$ac_includes_default"
+  ac_fn_c_check_decl "$LINENO" "strstr" "ac_cv_have_decl_strstr" "$ac_includes_default"
 if test "x$ac_cv_have_decl_strstr" = xyes; then :
   ac_have_decl=1
 else
index de6c311e076ddf550962263f339f41e49863b99a..36dece61723c10cccc8d6ce6c31eaa28cf8f17d6 100644 (file)
@@ -1,3 +1,18 @@
+2019-12-10  Christian Biesinger  <cbiesinger@google.com>
+
+       * Makefile.in: Add safe-strerror.c to gdbreplay and IPA, and change
+       UNDO_GNULIB_CFLAGS to undo strerror_r instead of strerror.
+       * config.in: Regenerate.
+       * configure: Regenerate.
+       * configure.ac: Don't check for strerror.
+       * linux-i386-ipa.c (initialize_fast_tracepoint_trampoline_buffer):
+       Call safe_strerror instead of strerror.
+       * server.h (strerror): Remove this now-unnecessary declaration.
+       * tracepoint.c (init_named_socket): Call safe_strerror instead of
+       strerror.
+       (gdb_agent_helper_thread): Likewise.
+       * utils.c (perror_with_name): Likewise.
+
 2019-11-26  Tom Tromey  <tom@tromey.com>
 
        * configure, config.in: Rebuild.
index e79d24f96f76d2d96fe08cacbb2710f6dbe15dca..10e004039f9661964bcd1f030b6ec2baae336222 100644 (file)
@@ -304,6 +304,7 @@ GDBREPLAY_OBS = \
        gdbsupport/errors.o \
        gdbsupport/netstuff.o \
        gdbsupport/print-utils.o \
+       gdbsupport/safe-strerror.o \
        gdbreplay.o \
        utils.o \
        version.o
@@ -430,6 +431,7 @@ IPA_OBJS = \
        gdbsupport/format-ipa.o \
        gdbsupport/print-utils-ipa.o \
        gdbsupport/rsp-low-ipa.o \
+       gdbsupport/safe-strerror-ipa.o \
        gdbsupport/tdesc-ipa.o \
        regcache-ipa.o \
        remote-utils-ipa.o \
@@ -557,7 +559,7 @@ UST_CFLAGS = $(ustinc) -DCONFIG_UST_GDB_INTEGRATION
 # Undo gnulib replacements for the IPA shared library build.
 # The gnulib headers are still needed, but gnulib is not linked
 # into the IPA lib so replacement apis don't work.
-UNDO_GNULIB_CFLAGS = -Drpl_strerror=strerror
+UNDO_GNULIB_CFLAGS = -Drpl_strerror_r=strerror_r
 
 # Note, we only build the IPA if -fvisibility=hidden is supported in
 # the first place.
index 14cf7099e39f8bdb297ca362607a9b78a4f61d3c..b1e58a394187161743665733f852bec9688e09ae 100644 (file)
    don't. */
 #undef HAVE_DECL_SNPRINTF
 
-/* Define to 1 if you have the declaration of `strerror', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRERROR
-
 /* Define to 1 if you have the declaration of `strstr', and to 0 if you don't.
    */
 #undef HAVE_DECL_STRSTR
index da17f8cb2cc6a21cb04d6138dd4a6b56652095c9..ccffde80edf5d7d58b2b8f3f43fea17641f30bc6 100755 (executable)
@@ -7022,17 +7022,7 @@ fi
 done
 
 
-  ac_fn_c_check_decl "$LINENO" "strerror" "ac_cv_have_decl_strerror" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR $ac_have_decl
-_ACEOF
-ac_fn_c_check_decl "$LINENO" "strstr" "ac_cv_have_decl_strstr" "$ac_includes_default"
+  ac_fn_c_check_decl "$LINENO" "strstr" "ac_cv_have_decl_strstr" "$ac_includes_default"
 if test "x$ac_cv_have_decl_strstr" = xyes; then :
   ac_have_decl=1
 else
@@ -8427,16 +8417,6 @@ _ACEOF
 
 
 
-ac_fn_c_check_decl "$LINENO" "strerror" "ac_cv_have_decl_strerror" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR $ac_have_decl
-_ACEOF
 ac_fn_c_check_decl "$LINENO" "perror" "ac_cv_have_decl_perror" "$ac_includes_default"
 if test "x$ac_cv_have_decl_perror" = xyes; then :
   ac_have_decl=1
index 07c9bd7fa7535748e46ec1db3800b754c447d681..4a6d88ebd198ac8479b161028118768b9257b62b 100644 (file)
@@ -158,7 +158,7 @@ LIBS="$old_LIBS"
 
 libiberty_INIT
 
-AC_CHECK_DECLS([strerror, perror, vasprintf, vsnprintf])
+AC_CHECK_DECLS([perror, vasprintf, vsnprintf])
 
 AC_CHECK_MEMBERS([struct stat.st_blocks, struct stat.st_blksize])
 
index 2e3d1ac7feed95eaace72454ca83423a534ff485..4bbc1b5f5124aff045b4843402907a8c5224a433 100644 (file)
@@ -210,7 +210,7 @@ initialize_fast_tracepoint_trampoline_buffer (void)
   if (!f)
     {    
       snprintf (buf, sizeof (buf), "mmap_min_addr open failed: %s",
-               strerror (errno));
+               safe_strerror (errno));
       set_trampoline_buffer_space (0, 0, buf);
       return;
     }
@@ -233,7 +233,7 @@ initialize_fast_tracepoint_trampoline_buffer (void)
       else
        {
          snprintf (buf, IPA_BUFSIZ, "low-64K-buffer mmap() failed: %s",
-                   strerror (errno));
+                   safe_strerror (errno));
          set_trampoline_buffer_space (0, 0, buf);
        }
     }
index e01c4f146edb6aeab1ff23dfe018f00546e8f8e5..3326159dfe17ef832816e122318fcedc108836d8 100644 (file)
@@ -29,12 +29,6 @@ gdb_static_assert (sizeof (CORE_ADDR) >= sizeof (void *));
 
 #include "gdbsupport/version.h"
 
-#if !HAVE_DECL_STRERROR
-#ifndef strerror
-extern char *strerror (int);   /* X3.159-1989  4.11.6.2 */
-#endif
-#endif
-
 #if !HAVE_DECL_PERROR
 #ifndef perror
 extern void perror (const char *);
index 2bd75dfb4aad868bbb8435d40ebb5e6c66b36e3d..9f8a49174c47fc51adbe574a07480e9e48519da7 100644 (file)
@@ -6879,7 +6879,7 @@ init_named_socket (const char *name)
   result = fd = socket (PF_UNIX, SOCK_STREAM, 0);
   if (result == -1)
     {
-      warning ("socket creation failed: %s", strerror (errno));
+      warning ("socket creation failed: %s", safe_strerror (errno));
       return -1;
     }
 
@@ -6895,7 +6895,7 @@ init_named_socket (const char *name)
       result = unlink (name);
       if (result == -1)
        {
-         warning ("unlink failed: %s", strerror (errno));
+         warning ("unlink failed: %s", safe_strerror (errno));
          close (fd);
          return -1;
        }
@@ -6905,7 +6905,7 @@ init_named_socket (const char *name)
   result = bind (fd, (struct sockaddr *) &addr, sizeof (addr));
   if (result == -1)
     {
-      warning ("bind failed: %s", strerror (errno));
+      warning ("bind failed: %s", safe_strerror (errno));
       close (fd);
       return -1;
     }
@@ -6913,7 +6913,7 @@ init_named_socket (const char *name)
   result = listen (fd, 1);
   if (result == -1)
     {
-      warning ("listen: %s", strerror (errno));
+      warning ("listen: %s", safe_strerror (errno));
       close (fd);
       return -1;
     }
@@ -7219,7 +7219,7 @@ gdb_agent_helper_thread (void *arg)
          if (fd < 0)
            {
              warning ("Accept returned %d, error: %s",
-                      fd, strerror (errno));
+                      fd, safe_strerror (errno));
              break;
            }
 
@@ -7231,7 +7231,7 @@ gdb_agent_helper_thread (void *arg)
          if (ret == -1)
            {
              warning ("reading socket (fd=%d) failed with %s",
-                      fd, strerror (errno));
+                      fd, safe_strerror (errno));
              close (fd);
              break;
            }
index 6a0e7a7a0f9bc3c6c503341edddd6422a9dfe6e6..b72dd0ec2b2c9bd35bc1dd01a6b5f1d375345abf 100644 (file)
@@ -47,7 +47,7 @@ perror_with_name (const char *string)
   const char *err;
   char *combined;
 
-  err = strerror (errno);
+  err = safe_strerror (errno);
   if (err == NULL)
     err = "unknown error";
 
index 6d55f586b8fc8b9e1acaa71f3499065249f72f6b..50e9500ffc8def7db42946a86618645274d0bf5e 100644 (file)
@@ -149,7 +149,7 @@ gdb_connect_sync_socket (int pid)
   res = fd = gdb_socket_cloexec (PF_UNIX, SOCK_STREAM, 0);
   if (res == -1)
     {
-      warning (_("error opening sync socket: %s"), strerror (errno));
+      warning (_("error opening sync socket: %s"), safe_strerror (errno));
       return -1;
     }
 
@@ -168,7 +168,7 @@ gdb_connect_sync_socket (int pid)
     {
       warning (_("error connecting sync socket (%s): %s. "
                 "Make sure the directory exists and that it is writable."),
-                path, strerror (errno));
+                path, safe_strerror (errno));
       close (fd);
       return -1;
     }
index 4f2bb5218d554fe321d3356aada532c2abb9ad17..c61753fb8e4ef3ef14fd95ee0000a896ccb659c2 100644 (file)
@@ -35,7 +35,7 @@ AC_DEFUN([GDB_AC_COMMON], [
   AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 socketpair sigaction \
                  sigprocmask])
 
-  AC_CHECK_DECLS([strerror, strstr])
+  AC_CHECK_DECLS([strstr])
 
   # Check for std::thread.  This does not work on some platforms, like
   # mingw and DJGPP.
index c37db579f785c2c0ec2a9689f0e9b3225674c442..7425af590f789c1625013c9dc51b505a324ad7fd 100644 (file)
 #include "common-defs.h"
 #include <string.h>
 
+/* There are two different versions of strerror_r; one is GNU-specific, the
+   other XSI-compliant.  They differ in the return type.  This overload lets
+   us choose the right behavior for each return type.  We cannot rely on Gnulib
+   to solve this for us because IPA does not use Gnulib but uses this
+   function.  */
+
+/* Called if we have a XSI-compliant strerror_r.  */
+static char *
+select_strerror_r (int res, char *buf)
+{
+  return res == 0 ? buf : nullptr;
+}
+
+/* Called if we have a GNU strerror_r.  */
+static char *
+select_strerror_r (char *res, char *)
+{
+  return res;
+}
+
 /* Implementation of safe_strerror as defined in common-utils.h.  */
 
 const char *
@@ -27,11 +47,9 @@ safe_strerror (int errnum)
 {
   static thread_local char buf[1024];
 
-  /* Assign the return value to an int, so we get an error if we accidentally
-     get the wrong version of this function (glibc has two of them...).  */
-  int ret = strerror_r (errnum, buf, sizeof (buf));
-  if (ret == 0)
-    return buf;
+  char *res = select_strerror_r (strerror_r (errnum, buf, sizeof (buf)), buf);
+  if (res != nullptr)
+    return res;
 
   xsnprintf (buf, sizeof buf, "(undocumented errno %d)", errnum);
   return buf;