From ab7d13f07027e6232a21448ef51f0a52a96738a9 Mon Sep 17 00:00:00 2001 From: Christian Biesinger Date: Wed, 6 Nov 2019 13:57:52 -0600 Subject: [PATCH] Replace the remaining uses of strerror with safe_strerror 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 * 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 * 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 --- gdb/ChangeLog | 10 ++++++++++ gdb/config.in | 4 ---- gdb/configure | 12 +----------- gdb/gdbserver/ChangeLog | 15 +++++++++++++++ gdb/gdbserver/Makefile.in | 4 +++- gdb/gdbserver/config.in | 4 ---- gdb/gdbserver/configure | 22 +--------------------- gdb/gdbserver/configure.ac | 2 +- gdb/gdbserver/linux-i386-ipa.c | 4 ++-- gdb/gdbserver/server.h | 6 ------ gdb/gdbserver/tracepoint.c | 12 ++++++------ gdb/gdbserver/utils.c | 2 +- gdb/gdbsupport/agent.c | 4 ++-- gdb/gdbsupport/common.m4 | 2 +- gdb/gdbsupport/safe-strerror.c | 28 +++++++++++++++++++++++----- 15 files changed, 66 insertions(+), 65 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ac58517ce17..a6e299d9053 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2019-12-10 Christian Biesinger + + * 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 * ada-typeprint.c (print_choices): Use a single "?". diff --git a/gdb/config.in b/gdb/config.in index 1caf76481b9..cb886ba8e1a 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -117,10 +117,6 @@ 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 diff --git a/gdb/configure b/gdb/configure index 6b64619df7a..324eb509440 100755 --- a/gdb/configure +++ b/gdb/configure @@ -13630,17 +13630,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 diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index de6c311e076..36dece61723 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,18 @@ +2019-12-10 Christian Biesinger + + * 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 * configure, config.in: Rebuild. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index e79d24f96f7..10e004039f9 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -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. diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index 14cf7099e39..b1e58a39418 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -54,10 +54,6 @@ 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 diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index da17f8cb2cc..ccffde80edf 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -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 diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index 07c9bd7fa75..4a6d88ebd19 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -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]) diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c index 2e3d1ac7fee..4bbc1b5f512 100644 --- a/gdb/gdbserver/linux-i386-ipa.c +++ b/gdb/gdbserver/linux-i386-ipa.c @@ -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); } } diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h index e01c4f146ed..3326159dfe1 100644 --- a/gdb/gdbserver/server.h +++ b/gdb/gdbserver/server.h @@ -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 *); diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 2bd75dfb4aa..9f8a49174c4 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -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; } diff --git a/gdb/gdbserver/utils.c b/gdb/gdbserver/utils.c index 6a0e7a7a0f9..b72dd0ec2b2 100644 --- a/gdb/gdbserver/utils.c +++ b/gdb/gdbserver/utils.c @@ -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"; diff --git a/gdb/gdbsupport/agent.c b/gdb/gdbsupport/agent.c index 6d55f586b8f..50e9500ffc8 100644 --- a/gdb/gdbsupport/agent.c +++ b/gdb/gdbsupport/agent.c @@ -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; } diff --git a/gdb/gdbsupport/common.m4 b/gdb/gdbsupport/common.m4 index 4f2bb5218d5..c61753fb8e4 100644 --- a/gdb/gdbsupport/common.m4 +++ b/gdb/gdbsupport/common.m4 @@ -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. diff --git a/gdb/gdbsupport/safe-strerror.c b/gdb/gdbsupport/safe-strerror.c index c37db579f78..7425af590f7 100644 --- a/gdb/gdbsupport/safe-strerror.c +++ b/gdb/gdbsupport/safe-strerror.c @@ -20,6 +20,26 @@ #include "common-defs.h" #include +/* 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; -- 2.30.2