summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-06-25 11:41:54 -0400
committerGreg Hudson <ghudson@mit.edu>2014-06-26 11:04:10 -0400
commit0f46175d632ae03ab7d4cfba5e62534d31e128e0 (patch)
tree1fb13adf400ff1c5d1d0df7437bc45ae73c4a446
parent476284de8dc9a52b5544445cb1b316a417ae88f0 (diff)
downloadkrb5-0f46175d632ae03ab7d4cfba5e62534d31e128e0.tar.gz
krb5-0f46175d632ae03ab7d4cfba5e62534d31e128e0.tar.xz
krb5-0f46175d632ae03ab7d4cfba5e62534d31e128e0.zip
Load plugins with RTLD_NODELETE if possible
On platforms which support RTLD_NODELETE, use it to load plugin modules. While using this flag makes plugins stay in the process map after libkrb5/libgssapi_krb5 are unloaded, it solves several problems: 1. It prevents plugin modules which link against OpenSSL (PKINIT and k5tls) from repeatedly initializing instances of libssl or libcrypto, leaking heap memory each time. This is only an issue because we cannot safely uninitialize OpenSSL. 2. It prevents finalization ordering issues from causing a process crash when unloading libgssapi_krb5 (issue #7135). 3. It makes memory leak tracing with valgrind easier. ticket: 7947 (new)
-rw-r--r--src/util/support/plugins.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/util/support/plugins.c b/src/util/support/plugins.c
index a04dfc38e..ca4b12858 100644
--- a/src/util/support/plugins.c
+++ b/src/util/support/plugins.c
@@ -45,6 +45,20 @@
#include "k5-platform.h"
+#if USE_DLOPEN
+#ifdef RTLD_GROUP
+#define GROUP RTLD_GROUP
+#else
+#define GROUP 0
+#endif
+#ifdef RTLD_NODELETE
+#define NODELETE RTLD_NODELETE
+#else
+#define NODELETE 0
+#endif
+#define PLUGIN_DLOPEN_FLAGS (RTLD_NOW | RTLD_LOCAL | GROUP | NODELETE)
+#endif
+
#if USE_DLOPEN && USE_CFBUNDLE
#include <CoreFoundation/CoreFoundation.h>
@@ -257,11 +271,6 @@ krb5int_open_plugin (const char *filepath, struct plugin_file_handle **h, struct
}
#endif /* USE_CFBUNDLE */
-#ifdef RTLD_GROUP
-#define PLUGIN_DLOPEN_FLAGS (RTLD_NOW | RTLD_LOCAL | RTLD_GROUP)
-#else
-#define PLUGIN_DLOPEN_FLAGS (RTLD_NOW | RTLD_LOCAL)
-#endif
if (!err) {
handle = dlopen(filepath, PLUGIN_DLOPEN_FLAGS);
if (handle == NULL) {