krb5 commit: Work around glibc bug 11941 (dlclose assertion)

Greg Hudson ghudson at mit.edu
Wed Oct 23 12:48:33 EDT 2019


https://github.com/krb5/krb5/commit/bf5953c549a6d279977df69ffe89b2ba51460eaf
commit bf5953c549a6d279977df69ffe89b2ba51460eaf
Author: Greg Hudson <ghudson at mit.edu>
Date:   Wed Oct 23 00:48:25 2019 -0400

    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 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/src/util/support/plugins.c b/src/util/support/plugins.c
index 47368be..3329db7 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 <features.h>
+#if ! __GLIBC_PREREQ(2, 25)
+#define dlclose(x)
+#endif
+#endif
+
 #if USE_DLOPEN && USE_CFBUNDLE
 #include <CoreFoundation/CoreFoundation.h>
 


More information about the cvs-krb5 mailing list