From 22391f24f056cb5e19e852c6c4966c0d753c2820 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Mon, 11 Nov 2024 01:10:58 +0100
Subject: [PATCH] managesieve: managesieve-client - Fix crash occurring when
 sieve_init() fails

---
 src/managesieve/main.c               | 2 +-
 src/managesieve/managesieve-client.c | 9 ++++++++-
 src/managesieve/managesieve-client.h | 2 +-
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/managesieve/main.c b/src/managesieve/main.c
index 186f107c4..25fe6bc24 100644
--- a/src/managesieve/main.c
+++ b/src/managesieve/main.c
@@ -178,7 +178,7 @@ client_create_from_input(const struct mail_storage_service_input *input,
 		verbose_proctitle = TRUE;
 
 	if (client_create(fd_in, fd_out, input->session_id,
-			  event, mail_user, set, &client) < 0) {
+			  event, mail_user, set, &client, error_r) < 0) {
 		settings_free(set);
 		mail_user_unref(&mail_user);
 		event_unref(&event);
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index 598941334..2c07afea6 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -105,7 +105,7 @@ client_get_storage(struct sieve_instance *svinst, struct event *event,
 int client_create(int fd_in, int fd_out, const char *session_id,
 		  struct event *event, struct mail_user *user,
 		  const struct managesieve_settings *set,
-		  struct client **client_r)
+		  struct client **client_r, const char **error_r)
 {
 	struct client *client;
 	struct sieve_environment svenv;
@@ -113,6 +113,9 @@ int client_create(int fd_in, int fd_out, const char *session_id,
 	struct sieve_storage *storage;
 	pool_t pool;
 
+	*client_r = NULL;
+	*error_r = NULL;
+
 	/* Initialize Sieve */
 
 	i_zero(&svenv);
@@ -124,6 +127,10 @@ int client_create(int fd_in, int fd_out, const char *session_id,
 
 	svinst = sieve_init(&svenv, &managesieve_sieve_callbacks,
 			    (void *) user, set->mail_debug);
+	if (svinst == NULL) {
+		*error_r = "Failed to initialize Sieve interpreter";
+		return -1;
+	}
 
 	/* Get Sieve storage */
 
diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h
index 4dad8b82b..c06ccb50f 100644
--- a/src/managesieve/managesieve-client.h
+++ b/src/managesieve/managesieve-client.h
@@ -94,7 +94,7 @@ extern unsigned int managesieve_client_count;
 int client_create(int fd_in, int fd_out, const char *session_id,
 		  struct event *event, struct mail_user *user,
 		  const struct managesieve_settings *set,
-		  struct client **client_r);
+		  struct client **client_r, const char **error_r);
 void client_create_finish(struct client *client);
 void client_destroy(struct client *client, const char *reason);
 
-- 
GitLab