From 6d8256313fed6533d293dc253d186a2dff1bd265 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Fri, 11 Oct 2024 22:12:39 +0200
Subject: [PATCH] lib-sieve: sieve-extensions - Notify caller of
 sieve_extensions_set_string() about extension load failures

---
 src/lib-sieve/sieve-extensions.c | 86 ++++++++++++++++++++++----------
 src/lib-sieve/sieve-extensions.h |  6 +--
 src/lib-sieve/sieve.c            |  2 +-
 3 files changed, 65 insertions(+), 29 deletions(-)

diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index 90c91780b..4127d4c24 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -259,18 +259,24 @@ void sieve_extensions_load(struct sieve_instance *svinst)
 
 	/* Apply sieve_extensions configuration */
 	if ((extensions = sieve_setting_get(
-		svinst, "sieve_extensions")) != NULL)
-		sieve_extensions_set_string(svinst, extensions, FALSE, FALSE);
+		svinst, "sieve_extensions")) != NULL) {
+		(void)sieve_extensions_set_string(svinst, extensions,
+						  FALSE, FALSE);
+	}
 
 	/* Apply sieve_global_extensions configuration */
 	if ((extensions = sieve_setting_get(
-		svinst, "sieve_global_extensions")) != NULL)
-		sieve_extensions_set_string(svinst, extensions, TRUE, FALSE);
+		svinst, "sieve_global_extensions")) != NULL) {
+		(void)sieve_extensions_set_string(svinst, extensions,
+						  TRUE, FALSE);
+	}
 
 	/* Apply sieve_implicit_extensions configuration */
 	if ((extensions = sieve_setting_get(
-		svinst, "sieve_implicit_extensions")) != NULL)
-		sieve_extensions_set_string(svinst, extensions, FALSE, TRUE);
+		svinst, "sieve_implicit_extensions")) != NULL) {
+		(void)sieve_extensions_set_string(svinst, extensions,
+						  FALSE, TRUE);
+	}
 }
 
 void sieve_extensions_deinit(struct sieve_instance *svinst)
@@ -620,46 +626,58 @@ const char *sieve_extensions_get_string(struct sieve_instance *svinst)
 	return str_c(extstr);
 }
 
-static void
+static int
 sieve_extension_set_enabled(struct sieve_extension *ext, bool enabled)
 {
+	int ret = 0;
+
 	if (enabled) {
 		ext->enabled = TRUE;
 
 		if (!ext->loaded)
-			(void)_sieve_extension_load(ext);
+			ret = _sieve_extension_load(ext);
 
 		ext->loaded = TRUE;
 	} else {
 		ext->enabled = FALSE;
 	}
+
+	return ret;
 }
 
-static void
+static int
 sieve_extension_set_global(struct sieve_extension *ext, bool enabled)
 {
+	int ret = 0;
+
 	if (enabled) {
-		sieve_extension_set_enabled(ext, TRUE);
+		ret = sieve_extension_set_enabled(ext, TRUE);
 		ext->global = TRUE;
 	} else {
 		ext->global = FALSE;
 	}
+
+	return ret;
 }
 
-static void
+static int
 sieve_extension_set_implicit(struct sieve_extension *ext, bool enabled)
 {
+	int ret = 0;
+
 	if (enabled) {
-		sieve_extension_set_enabled(ext, TRUE);
+		ret = sieve_extension_set_enabled(ext, TRUE);
 		ext->implicit = TRUE;
 	} else {
 		ext->implicit = FALSE;
 	}
+
+	return ret;
 }
 
-void sieve_extensions_set_string(struct sieve_instance *svinst,
-				 const char *ext_string, bool global,
-				 bool implicit)
+int sieve_extensions_set_string(struct sieve_instance *svinst,
+				const char *ext_string, bool global,
+				bool implicit)
 {
 	struct sieve_extension_registry *ext_reg = svinst->ext_reg;
 	ARRAY(const struct sieve_extension *) enabled_extensions;
@@ -673,16 +691,19 @@ void sieve_extensions_set_string(struct sieve_instance *svinst,
 
 	if (ext_string == NULL) {
 		if (global || implicit)
-			return;
+			return 0;
 
 		/* Enable all */
 		exts = array_get_modifiable(&ext_reg->extensions, &ext_count);
 
-		for (i = 0; i < ext_count; i++)
-			sieve_extension_set_enabled(exts[i], TRUE);
-		return;
+		for (i = 0; i < ext_count; i++) {
+			if (sieve_extension_set_enabled(exts[i], TRUE) < 0)
+				return -1;
+		}
+		return 0;
 	}
 
+	int ret = 0;
 	T_BEGIN {
 		t_array_init(&enabled_extensions,
 			     array_count(&ext_reg->extensions));
@@ -775,14 +796,29 @@ void sieve_extensions_set_string(struct sieve_instance *svinst,
 			}
 
 			/* Perform actual activation/deactivation */
-			if (global)
-				sieve_extension_set_global(exts[i], enabled);
-			else if (implicit)
-				sieve_extension_set_implicit(exts[i], enabled);
-			else
-				sieve_extension_set_enabled(exts[i], enabled);
+			if (global) {
+				if (sieve_extension_set_global(exts[i],
+							       enabled) < 0) {
+					ret = -1;
+					break;
+				}
+			} else if (implicit) {
+				if (sieve_extension_set_implicit(exts[i],
+								 enabled) < 0) {
+					ret = -1;
+					break;
+				}
+			} else {
+				if (sieve_extension_set_enabled(exts[i],
+								enabled) < 0) {
+					ret = -1;
+					break;
+				}
+			}
 		}
 	} T_END;
+
+	return ret;
 }
 
 const struct sieve_extension *
diff --git a/src/lib-sieve/sieve-extensions.h b/src/lib-sieve/sieve-extensions.h
index db6d621b5..ae819e78c 100644
--- a/src/lib-sieve/sieve-extensions.h
+++ b/src/lib-sieve/sieve-extensions.h
@@ -153,9 +153,9 @@ const struct sieve_extension *
 sieve_extension_get_by_name(struct sieve_instance *svinst, const char *name);
 
 const char *sieve_extensions_get_string(struct sieve_instance *svinst);
-void sieve_extensions_set_string(struct sieve_instance *svinst,
-				 const char *ext_string, bool global,
-				 bool implicit);
+int sieve_extensions_set_string(struct sieve_instance *svinst,
+				const char *ext_string, bool global,
+				bool implicit);
 
 const struct sieve_extension *
 sieve_get_match_type_extension(struct sieve_instance *svinst);
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 409d65f21..462f47d32 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -181,7 +181,7 @@ int sieve_settings_reload(struct sieve_instance *svinst)
 
 void sieve_set_extensions(struct sieve_instance *svinst, const char *extensions)
 {
-	sieve_extensions_set_string(svinst, extensions, FALSE, FALSE);
+	(void)sieve_extensions_set_string(svinst, extensions, FALSE, FALSE);
 }
 
 const char *
-- 
GitLab