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

Greg Hudson <[email protected]>
Newsgroups gmane.comp.encryption.kerberos.cvs
Message-ID <[email protected]>
https://github.com/krb5/krb5/commit/bf5953c549a6d279977df69ffe89b2ba51460eaf
commit bf5953c549a6d279977df69ffe89b2ba51460eaf
Author: Greg Hudson <[email protected]>
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>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.