plugin-loader: Do not unload libraries during dlclose(), if supported
authorMartin Willi <martin@revosec.ch>
Tue, 24 Feb 2015 10:50:21 +0000 (11:50 +0100)
committerMartin Willi <martin@revosec.ch>
Tue, 24 Feb 2015 11:25:01 +0000 (12:25 +0100)
Unloading libraries calls any library constructor/destructor functions. Some
libraries can't handle that in our excessive unit test use. GnuTLS leaks
a /dev/urandom file descriptor, letting unit tests fail with arbitrary
out-of-resources errors.

src/libstrongswan/plugins/plugin_loader.c

index 1fec1b3..84ff88f 100644 (file)
@@ -380,7 +380,15 @@ static plugin_entry_t *load_plugin(private_plugin_loader_t *this, char *name,
                        return NULL;
                }
        }
-       handle = dlopen(file, RTLD_LAZY);
+       handle = dlopen(file, RTLD_LAZY
+#ifdef RTLD_NODELETE
+       /* if supported, do not unload library when unloading a plugin. It really
+        * doesn't matter in productive systems, but causes many (dependency)
+        * library reloads during unit tests. Some libraries can't handle that,
+        * GnuTLS leaks file descriptors in its library load/unload functions. */
+                                       | RTLD_NODELETE
+#endif
+                                       );
        if (handle == NULL)
        {
                DBG1(DBG_LIB, "plugin '%s' failed to load: %s", name, dlerror());