libdwfl: use GNU strerror_r only when available.
authorÉrico Rolim <erico.erc@gmail.com>
Tue, 2 Feb 2021 00:16:56 +0000 (21:16 -0300)
committerMark Wielaard <mark@klomp.org>
Fri, 5 Feb 2021 14:36:25 +0000 (15:36 +0100)
Some C libraries don't provide the GNU version of strerror_r, only the
XSI-compliant one. We use the GNU version when available, since it fits
the code better, and otherwise use the XSI-compliant one.

https://sourceware.org/bugzilla/show_bug.cgi?id=21010

Signed-off-by: Érico Rolim <erico.erc@gmail.com>
ChangeLog
configure.ac
libdwfl/ChangeLog
libdwfl/dwfl_error.c

index 142caa2..c8f921a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2021-02-01  Érico Nogueira  <ericonr@disroot.org>
+
+       * configure.ac: Check for GNU strerror_r.
+
 2021-01-12  Dmitry V. Levin  <ldv@altlinux.org>
 
        * configure.ac [--enable-gcov]: Check for gcov, lcov, and genhtml.
index 346ab80..47db847 100644 (file)
@@ -428,6 +428,11 @@ AC_CHECK_DECLS([mempcpy],[],[],
 
 AC_CHECK_FUNCS([process_vm_readv])
 
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+AC_FUNC_STRERROR_R()
+CFLAGS="$old_CFLAGS"
+
 AC_CHECK_LIB([stdc++], [__cxa_demangle], [dnl
 AC_DEFINE([USE_DEMANGLE], [1], [Defined if demangling is enabled])])
 AM_CONDITIONAL(DEMANGLE, test "x$ac_cv_lib_stdcpp___cxa_demangle" = "xyes")
index 5058f5f..d107e78 100644 (file)
@@ -1,3 +1,7 @@
+2021-02-01  Érico Nogueira  <ericonr@disroot.org>
+
+       * dwfl_error.c (strerror_r): Only use the GNU version when available.
+
 2021-01-08  Timm Bäder  <tbaeder@redhat.com>
 
        * elf-from-memory.c (elf_from_remote_memory): Add for loop over
index 7bcf61c..a5c683a 100644 (file)
@@ -137,6 +137,21 @@ __libdwfl_seterrno (Dwfl_Error error)
 }
 
 
+static const char *
+errnomsg(int error)
+{
+  /* Won't be changed by strerror_r, but not const so compiler doesn't throw warning */
+  static char unknown[] = "unknown error";
+
+#ifdef STRERROR_R_CHAR_P
+  return strerror_r (error, unknown, 0);
+#else
+  /* To store the error message from strerror_r in a thread-safe manner */
+  static __thread char msg[128];
+  return strerror_r (error, msg, sizeof (msg)) ? unknown : msg;
+#endif
+}
+
 const char *
 dwfl_errmsg (int error)
 {
@@ -154,7 +169,7 @@ dwfl_errmsg (int error)
   switch (error &~ 0xffff)
     {
     case OTHER_ERROR (ERRNO):
-      return strerror_r (error & 0xffff, "bad", 0);
+      return errnomsg (error & 0xffff);
     case OTHER_ERROR (LIBELF):
       return elf_errmsg (error & 0xffff);
     case OTHER_ERROR (LIBDW):