From bf5953c549a6d279977df69ffe89b2ba51460eaf Mon Sep 17 00:00:00 2001 From: Greg Hudson Date: Wed, 23 Oct 2019 00:48:25 -0400 Subject: [PATCH] Work around glibc bug 11941 (dlclose assertion) When building against glibc 2.24 or earlier, suppress calls to dlclose() to prevent the assertion failure "_dl_close: Assertion `map->l_init_called' failed" at process exit. We need this workaround to enable automated tests that load GSSAPI modules. ticket: 7135 --- src/util/support/plugins.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/util/support/plugins.c b/src/util/support/plugins.c index 47368be9d4..3329db7dc3 100644 --- a/src/util/support/plugins.c +++ b/src/util/support/plugins.c @@ -54,6 +54,21 @@ #define PLUGIN_DLOPEN_FLAGS (RTLD_NOW | RTLD_LOCAL | GROUP | NODELETE) #endif +/* + * glibc bug 11941, fixed in release 2.25, can cause an assertion failure in + * dlclose() on process exit. Our workaround is to leak dlopen() handles + * (which doesn't typically manifest in leak detection tools because the + * handles are still reachable via a global table in libdl). Because we + * dlopen() with RTLD_NODELETE, we weren't going to unload the plugin objects + * anyway. + */ +#ifdef __linux__ +#include +#if ! __GLIBC_PREREQ(2, 25) +#define dlclose(x) +#endif +#endif + #if USE_DLOPEN && USE_CFBUNDLE #include -- 2.47.2