diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-09-21 15:11:10 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-09-21 15:11:10 +0200 |
| commit | 75dd467dc5f85b66c00a6e6bc8fe177395a0a074 (patch) | |
| tree | 083501b49846fe13f6ee5e171aac6ee7e8614702 /libdecor | |
| parent | a2bf4d7ef291c4a2ffcc4931d07fc00c307efc8d (diff) | |
Update with changes from source (commit bcb1d791) - cont'd.
Diffstat (limited to 'libdecor')
| -rw-r--r-- | libdecor/src/libdecor-plugin.h | 4 | ||||
| -rw-r--r-- | libdecor/src/libdecor.c | 24 |
2 files changed, 28 insertions, 0 deletions
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, |
