diff --git a/libdecor/src/libdecor-plugin.h b/libdecor/src/libdecor-plugin.h index e91ee2b00..ba80ce642 100644 --- a/libdecor/src/libdecor-plugin.h +++ b/libdecor/src/libdecor-plugin.h @@ -1,6 +1,7 @@ /* * Copyright © 2017-2018 Red Hat Inc. * Copyright © 2018 Jonas Ådahl + * Copyright © 2019 Christian Rauch * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -79,6 +80,9 @@ struct libdecor_plugin_description { /* Vfunc used for constructing a plugin instance. */ libdecor_plugin_constructor constructor; + + /* NULL terminated list of incompatible symbols. */ + char *conflicting_symbols[1024]; }; struct libdecor_plugin_interface { diff --git a/libdecor/src/libdecor.c b/libdecor/src/libdecor.c index 9bd418fe2..7d48d1427 100644 --- a/libdecor/src/libdecor.c +++ b/libdecor/src/libdecor.c @@ -1,6 +1,7 @@ /* * Copyright © 2017-2018 Red Hat Inc. * Copyright © 2018 Jonas Ådahl + * Copyright © 2019 Christian Rauch * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -1387,6 +1388,24 @@ calculate_priority(const struct libdecor_plugin_description *plugin_description) return -1; } +static bool +check_symbol_conflicts(const struct libdecor_plugin_description *plugin_description) +{ + char * const *symbol; + + symbol = plugin_description->conflicting_symbols; + while (*symbol) { + dlerror(); + dlsym (RTLD_DEFAULT, *symbol); + if (!dlerror()) + return false; + + symbol++; + } + + return true; +} + static struct plugin_loader * load_plugin_loader(struct libdecor *context, const char *path, @@ -1438,6 +1457,11 @@ load_plugin_loader(struct libdecor *context, return NULL; } + if (!check_symbol_conflicts(plugin_description)) { + dlclose(lib); + return NULL; + } + priority = calculate_priority(plugin_description); if (priority == -1) { fprintf(stderr,