From 9a41860b7c2fa635e54675df93caddf450e19915 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Fri, 11 Oct 2024 23:08:19 +0200
Subject: [PATCH] lib-sieve: sieve - Make sieve instance initialization fail if
 extension fails to load

---
 src/lib-sieve/sieve-extensions.c | 18 +++++++++++-------
 src/lib-sieve/sieve-extensions.h |  2 +-
 src/lib-sieve/sieve.c            |  5 ++++-
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index 4127d4c24..a6400c438 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -253,30 +253,34 @@ int sieve_extensions_init(struct sieve_instance *svinst)
 	return 0;
 }
 
-void sieve_extensions_load(struct sieve_instance *svinst)
+int sieve_extensions_load(struct sieve_instance *svinst)
 {
 	const char *extensions;
 
 	/* Apply sieve_extensions configuration */
 	if ((extensions = sieve_setting_get(
 		svinst, "sieve_extensions")) != NULL) {
-		(void)sieve_extensions_set_string(svinst, extensions,
-						  FALSE, FALSE);
+		if (sieve_extensions_set_string(svinst, extensions,
+						FALSE, FALSE) < 0)
+			return -1;
 	}
 
 	/* Apply sieve_global_extensions configuration */
 	if ((extensions = sieve_setting_get(
 		svinst, "sieve_global_extensions")) != NULL) {
-		(void)sieve_extensions_set_string(svinst, extensions,
-						  TRUE, FALSE);
+		if (sieve_extensions_set_string(svinst, extensions,
+						TRUE, FALSE) < 0)
+			return -1;
 	}
 
 	/* Apply sieve_implicit_extensions configuration */
 	if ((extensions = sieve_setting_get(
 		svinst, "sieve_implicit_extensions")) != NULL) {
-		(void)sieve_extensions_set_string(svinst, extensions,
-						  FALSE, TRUE);
+		if (sieve_extensions_set_string(svinst, extensions,
+						FALSE, TRUE) < 0)
+			return -1;
 	}
+	return 0;
 }
 
 void sieve_extensions_deinit(struct sieve_instance *svinst)
diff --git a/src/lib-sieve/sieve-extensions.h b/src/lib-sieve/sieve-extensions.h
index ae819e78c..5bbfdbf67 100644
--- a/src/lib-sieve/sieve-extensions.h
+++ b/src/lib-sieve/sieve-extensions.h
@@ -112,7 +112,7 @@ struct sieve_extension {
  */
 
 int sieve_extensions_init(struct sieve_instance *svinst);
-void sieve_extensions_load(struct sieve_instance *svinst);
+int sieve_extensions_load(struct sieve_instance *svinst);
 void sieve_extensions_deinit(struct sieve_instance *svinst);
 
 /*
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 462f47d32..757e82f74 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -138,7 +138,10 @@ int sieve_init(const struct sieve_environment *env,
 	sieve_plugins_load(svinst, NULL, NULL);
 
 	/* Load extensions */
-	sieve_extensions_load(svinst);
+	if (sieve_extensions_load(svinst) < 0) {
+		sieve_deinit(&svinst);
+		return -1;
+	}
 
 	*svinst_r = svinst;
 	return 0;
-- 
GitLab