diff options
author | Érico Rolim <erico.erc@gmail.com> | 2021-02-01 21:16:56 -0300 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2021-02-05 15:36:25 +0100 |
commit | 8db222e36ae777e6aec8c61c616838a86258e99f (patch) | |
tree | e626106aa1745aabfb1df3a135f4dcf24caf8aa3 /libdwfl | |
parent | eb922a1b8f3a7b1d9740bc789fdf499637ded111 (diff) | |
download | elfutils-8db222e36ae777e6aec8c61c616838a86258e99f.tar.gz |
libdwfl: use GNU strerror_r only when available.
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>
Diffstat (limited to 'libdwfl')
-rw-r--r-- | libdwfl/ChangeLog | 4 | ||||
-rw-r--r-- | libdwfl/dwfl_error.c | 17 |
2 files changed, 20 insertions, 1 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 5058f5f8..d107e78f 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -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 diff --git a/libdwfl/dwfl_error.c b/libdwfl/dwfl_error.c index 7bcf61cc..a5c683a9 100644 --- a/libdwfl/dwfl_error.c +++ b/libdwfl/dwfl_error.c @@ -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): |