plugin: use RTLD_LOCAL instead of RTLD_GLOBAL when loading library
authorRafał Miłecki <rafal@milecki.pl>
Thu, 9 Nov 2017 14:08:16 +0000 (15:08 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 9 Nov 2017 14:49:15 +0000 (15:49 +0100)
RTLD_GLOBAL was used to allow plugins use each other symbols but this
facility was (most likely) never used and is a bad design anyway. If
there is a common code it should just go to a library.

Using RTLD_LOCAL on the other hand saves us from conflicting symbols
used by different plugins. An example can be iwinfo plugin using libnl.
If there appears to be another plugin using incompatible netlink
implementation this will result in a problem. Both plugins will start
using the same libnl which will break one of them.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Acked-by: Jo-Philipp Wich <jo@mein.io>
plugin.c

index 70d2c563ba3f12329b138481be12f825efd2f2ea..532fa15284b17a715d896244043befc2c93e1063 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -412,7 +412,7 @@ rpc_plugin_register_library(struct ubus_context *ctx, const char *path)
        struct rpc_plugin *p;
        void *dlh;
 
-       dlh = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
+       dlh = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
 
        if (!dlh)
                return UBUS_STATUS_UNKNOWN_ERROR;