aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/config.in4
-rwxr-xr-xgdb/configure12
-rw-r--r--gdb/gdbserver/ChangeLog15
-rw-r--r--gdb/gdbserver/Makefile.in4
-rw-r--r--gdb/gdbserver/config.in4
-rwxr-xr-xgdb/gdbserver/configure22
-rw-r--r--gdb/gdbserver/configure.ac2
-rw-r--r--gdb/gdbserver/linux-i386-ipa.c4
-rw-r--r--gdb/gdbserver/server.h6
-rw-r--r--gdb/gdbserver/tracepoint.c12
-rw-r--r--gdb/gdbserver/utils.c2
-rw-r--r--gdb/gdbsupport/agent.c4
-rw-r--r--gdb/gdbsupport/common.m42
-rw-r--r--gdb/gdbsupport/safe-strerror.c28
15 files changed, 66 insertions, 65 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ac58517..a6e299d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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 "?".
diff --git a/gdb/config.in b/gdb/config.in
index 1caf764..cb886ba 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 6b64619..324eb50 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 de6c311..36dece6 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -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.
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index e79d24f..10e0040 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 14cf709..b1e58a3 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 da17f8c..ccffde8 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 07c9bd7..4a6d88e 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 2e3d1ac..4bbc1b5 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 e01c4f1..3326159 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 2bd75df..9f8a491 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 6a0e7a7..b72dd0e 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 6d55f58..50e9500 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 4f2bb52..c61753f 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 c37db57..7425af5 100644
--- a/gdb/gdbsupport/safe-strerror.c
+++ b/gdb/gdbsupport/safe-strerror.c
@@ -20,6 +20,26 @@
#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;