From a2a9751823d506ccd9cd4264fd2e97032d306cb5 Mon Sep 17 00:00:00 2001 From: Patrick Gauvin Date: Sun, 26 Jun 2016 12:43:25 -0400 Subject: libdl: Clear error between dlerror invocations Updates #2747 --- cpukit/libdl/dlfcn.c | 2 ++ cpukit/libdl/rtl-error.c | 12 ++++++++++++ cpukit/libdl/rtl-error.h | 5 +++++ 3 files changed, 19 insertions(+) (limited to 'cpukit') diff --git a/cpukit/libdl/dlfcn.c b/cpukit/libdl/dlfcn.c index 3b31bb2e8e..4277caf757 100644 --- a/cpukit/libdl/dlfcn.c +++ b/cpukit/libdl/dlfcn.c @@ -18,6 +18,7 @@ #include #include #include +#include "rtl-error.h" static rtems_rtl_obj_t* dl_get_obj_from_handle (void* handle) @@ -130,6 +131,7 @@ dlerror (void) { static char msg[64]; rtems_rtl_get_error (msg, sizeof (msg)); + rtems_rtl_clear_error (); return msg; } diff --git a/cpukit/libdl/rtl-error.c b/cpukit/libdl/rtl-error.c index 5ec4b26ef7..a60074fcd0 100644 --- a/cpukit/libdl/rtl-error.c +++ b/cpukit/libdl/rtl-error.c @@ -52,3 +52,15 @@ rtems_rtl_get_error (char* message, size_t max_message) return EIO; } + +void +rtems_rtl_clear_error (void) +{ + rtems_rtl_data_t* rtl = rtems_rtl_lock (); + if (rtl != NULL) + { + rtl->last_errno = 0; + rtl->last_error[0] = '\0'; + rtems_rtl_unlock (); + } +} diff --git a/cpukit/libdl/rtl-error.h b/cpukit/libdl/rtl-error.h index 0badf51e21..f1cf4ea72c 100644 --- a/cpukit/libdl/rtl-error.h +++ b/cpukit/libdl/rtl-error.h @@ -37,6 +37,11 @@ extern "C" { */ void rtems_rtl_set_error (int error, const char* format, ...) RTEMS_RTL_PRINTF_ATTR; +/** + * Clears the error. + */ +void rtems_rtl_clear_error (void); + #ifdef __cplusplus } #endif /* __cplusplus */ -- cgit v1.2.3