From 7c8da469812c35306d635c14c806e5a2093732c2 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Sat, 12 Oct 2024 00:20:23 +0200 Subject: [PATCH] lib-sieve: sieve - Make sieve instance initialization fail if plugin fails to load --- src/lib-sieve/sieve-plugins.c | 19 +++++++++++-------- src/lib-sieve/sieve-plugins.h | 4 ++-- src/lib-sieve/sieve.c | 7 +++++-- .../storage/ldap/sieve-ldap-storage.c | 10 ++++++---- .../imapsieve/sieve-imapsieve-plugin.c | 7 ++++--- .../imapsieve/sieve-imapsieve-plugin.h | 4 ++-- .../sieve-extprograms-plugin.c | 11 ++++++----- .../sieve-extprograms-plugin.h | 4 ++-- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/lib-sieve/sieve-plugins.c b/src/lib-sieve/sieve-plugins.c index 2fadf27ac..178a178e6 100644 --- a/src/lib-sieve/sieve-plugins.c +++ b/src/lib-sieve/sieve-plugins.c @@ -15,7 +15,7 @@ * Types */ -typedef void +typedef int (*sieve_plugin_load_func_t)(struct sieve_instance *svinst, void **context); typedef void (*sieve_plugin_unload_func_t)(struct sieve_instance *svinst, void *context); @@ -53,8 +53,8 @@ static struct module *sieve_plugin_module_find(const char *name) return NULL; } -void sieve_plugins_load(struct sieve_instance *svinst, const char *path, - const char *plugins) +int sieve_plugins_load(struct sieve_instance *svinst, const char *path, + const char *plugins) { struct module *module; struct module_dir_load_settings mod_set; @@ -69,7 +69,7 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path, } if (plugins == NULL || *plugins == '\0') - return; + return 0; if (path == NULL || *path == '\0') path = MODULEDIR"/sieve"; @@ -123,10 +123,12 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path, plugin->module = module; /* Call load function */ - load_func = (sieve_plugin_load_func_t) module_get_symbol - (module, t_strdup_printf("%s_load", module->name)); - if (load_func != NULL) - load_func(svinst, &plugin->context); + load_func = (sieve_plugin_load_func_t) + module_get_symbol(module, + t_strdup_printf("%s_load", module->name)); + if (load_func != NULL && + load_func(svinst, &plugin->context) < 0) + return -1; /* Add plugin to the instance */ if (svinst->plugins == NULL) @@ -141,6 +143,7 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path, plugin_last->next = plugin; } } + return 0; } void sieve_plugins_unload(struct sieve_instance *svinst) diff --git a/src/lib-sieve/sieve-plugins.h b/src/lib-sieve/sieve-plugins.h index ae5f73944..5b621d594 100644 --- a/src/lib-sieve/sieve-plugins.h +++ b/src/lib-sieve/sieve-plugins.h @@ -3,8 +3,8 @@ #include "sieve-common.h" -void sieve_plugins_load(struct sieve_instance *svinst, const char *path, - const char *plugins); +int sieve_plugins_load(struct sieve_instance *svinst, const char *path, + const char *plugins); void sieve_plugins_unload(struct sieve_instance *svinst); #endif diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 757e82f74..a0ba62f79 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -134,8 +134,11 @@ int sieve_init(const struct sieve_environment *env, /* Initialize storage classes */ sieve_storages_init(svinst); - /* Initialize plugins */ - sieve_plugins_load(svinst, NULL, NULL); + /* Load plugins */ + if (sieve_plugins_load(svinst, NULL, NULL) < 0) { + sieve_deinit(&svinst); + return -1; + } /* Load extensions */ if (sieve_extensions_load(svinst) < 0) { diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c index 11ff505d4..38edfef3a 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c @@ -182,21 +182,23 @@ const struct sieve_storage sieve_ldap_storage_plugin = { const char *sieve_storage_ldap_plugin_version = PIGEONHOLE_ABI_VERSION; -void sieve_storage_ldap_plugin_load(struct sieve_instance *svinst, - void **context); +int sieve_storage_ldap_plugin_load(struct sieve_instance *svinst, + void **context); void sieve_storage_ldap_plugin_unload(struct sieve_instance *svinst, void *context); void sieve_storage_ldap_plugin_init(void); void sieve_storage_ldap_plugin_deinit(void); -void sieve_storage_ldap_plugin_load(struct sieve_instance *svinst, - void **context ATTR_UNUSED) +int sieve_storage_ldap_plugin_load(struct sieve_instance *svinst, + void **context ATTR_UNUSED) { sieve_storage_class_register(svinst, &sieve_ldap_storage_plugin); e_debug(svinst->event, "Sieve LDAP storage plugin for %s version %s loaded", PIGEONHOLE_NAME, PIGEONHOLE_VERSION_FULL); + + return 0; } void sieve_storage_ldap_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED, diff --git a/src/plugins/imapsieve/sieve-imapsieve-plugin.c b/src/plugins/imapsieve/sieve-imapsieve-plugin.c index 819188f97..2c13e6dde 100644 --- a/src/plugins/imapsieve/sieve-imapsieve-plugin.c +++ b/src/plugins/imapsieve/sieve-imapsieve-plugin.c @@ -20,7 +20,7 @@ struct _plugin_context { const char *sieve_imapsieve_plugin_version = PIGEONHOLE_ABI_VERSION; -void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context) +int sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context) { const struct sieve_extension *ext_imapsieve; const struct sieve_extension *ext_vnd_imapsieve; @@ -28,10 +28,10 @@ void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context) if (sieve_extension_register(svinst, &imapsieve_extension_dummy, TRUE, &ext_imapsieve) < 0) - ext_imapsieve = NULL; + return -1; if (sieve_extension_register(svinst, &vnd_imapsieve_extension_dummy, TRUE, &ext_vnd_imapsieve) < 0) - ext_vnd_imapsieve = NULL; + return -1; pctx = i_new(struct _plugin_context, 1); pctx->ext_imapsieve = ext_imapsieve; @@ -42,6 +42,7 @@ void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context) PIGEONHOLE_NAME, PIGEONHOLE_VERSION_FULL); *context = pctx; + return 0; } void sieve_imapsieve_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED, diff --git a/src/plugins/imapsieve/sieve-imapsieve-plugin.h b/src/plugins/imapsieve/sieve-imapsieve-plugin.h index 1fffba1a7..ae988a41b 100644 --- a/src/plugins/imapsieve/sieve-imapsieve-plugin.h +++ b/src/plugins/imapsieve/sieve-imapsieve-plugin.h @@ -5,8 +5,8 @@ * Plugin interface */ -void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, - void **context); +int sieve_imapsieve_plugin_load(struct sieve_instance *svinst, + void **context); void sieve_imapsieve_plugin_unload(struct sieve_instance *svinst, void *context); diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c index 4c4fdd18c..df00bc047 100644 --- a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c +++ b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c @@ -20,8 +20,8 @@ struct _plugin_context { const char *sieve_extprograms_plugin_version = PIGEONHOLE_ABI_VERSION; -void sieve_extprograms_plugin_load(struct sieve_instance *svinst, - void **context) +int sieve_extprograms_plugin_load(struct sieve_instance *svinst, + void **context) { const struct sieve_extension *ext_pipe; const struct sieve_extension *ext_filter; @@ -30,13 +30,13 @@ void sieve_extprograms_plugin_load(struct sieve_instance *svinst, if (sieve_extension_register(svinst, &sieve_ext_vnd_pipe, FALSE, &ext_pipe) < 0) - ext_pipe = NULL; + return -1; if (sieve_extension_register(svinst, &sieve_ext_vnd_filter, FALSE, &ext_filter) < 0) - ext_filter = NULL; + return -1; if (sieve_extension_register(svinst, &sieve_ext_vnd_execute, FALSE, &ext_execute) < 0) - ext_execute = NULL; + return -1; pctx = i_new(struct _plugin_context, 1); pctx->ext_pipe = ext_pipe; @@ -50,6 +50,7 @@ void sieve_extprograms_plugin_load(struct sieve_instance *svinst, } *context = pctx; + return 0; } void sieve_extprograms_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED, diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h index e6a4a9692..127f2b1d5 100644 --- a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h +++ b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h @@ -5,8 +5,8 @@ * Plugin interface */ -void sieve_extprograms_plugin_load(struct sieve_instance *svinst, - void **context); +int sieve_extprograms_plugin_load(struct sieve_instance *svinst, + void **context); void sieve_extprograms_plugin_unload(struct sieve_instance *svinst, void *context); -- GitLab