summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Gauvin <gauvin@hcs.ufl.edu>2016-06-26 12:43:25 -0400
committerChris Johns <chrisj@rtems.org>2018-02-08 14:21:13 +1100
commita2a9751823d506ccd9cd4264fd2e97032d306cb5 (patch)
treee3067477cc1d8166f11a846a01b9b3f8acb9ea6a
parenttestsuites/libtest: Set EXENT to .exe so executable are correctly named. (diff)
downloadrtems-a2a9751823d506ccd9cd4264fd2e97032d306cb5.tar.bz2
libdl: Clear error between dlerror invocations
Updates #2747
-rw-r--r--cpukit/libdl/dlfcn.c2
-rw-r--r--cpukit/libdl/rtl-error.c12
-rw-r--r--cpukit/libdl/rtl-error.h5
3 files changed, 19 insertions, 0 deletions
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 <stdint.h>
#include <dlfcn.h>
#include <rtems/rtl/rtl.h>
+#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 */