diff options
Diffstat (limited to 'libdecor/src/libdecor.c')
| -rw-r--r-- | libdecor/src/libdecor.c | 24 |
1 files changed, 24 insertions, 0 deletions
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, |
