From 7c53cc1fe5620d1a5402f0079f509d2aafe6ecd6 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Tue, 17 Sep 2024 00:56:47 +0200
Subject: [PATCH] lib-sieve: sieve-storage - Use int for
 sieve_storage_create_personal() status result

---
 .../plugins/include/ext-include-common.c      | 10 ++--
 src/lib-sieve/sieve-storage.c                 | 46 +++++++++++--------
 src/lib-sieve/sieve-storage.h                 | 10 ++--
 src/managesieve/managesieve-client.c          |  7 ++-
 src/plugins/doveadm-sieve/doveadm-sieve-cmd.c |  6 +--
 .../doveadm-sieve/doveadm-sieve-sync.c        |  7 ++-
 .../imap-filter-sieve/imap-filter-sieve.c     |  7 ++-
 src/plugins/imapsieve/imap-sieve.c            |  6 +--
 src/plugins/lda-sieve/lda-sieve-plugin.c      |  5 +-
 9 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index f9eac908c..479ae5687 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -142,11 +142,11 @@ ext_include_get_script_storage(const struct sieve_extension *ext,
 
 	switch (location) {
 	case EXT_INCLUDE_LOCATION_PERSONAL:
-		if (ctx->personal_storage == NULL) {
-			ctx->personal_storage =
-				sieve_storage_create_personal(svinst, NULL, 0,
-							      error_code_r);
-		}
+		if (ctx->personal_storage == NULL &&
+		    sieve_storage_create_personal(svinst, NULL, 0,
+						  &ctx->personal_storage,
+						  error_code_r) < 0)
+			return NULL;
 		return ctx->personal_storage;
 	case EXT_INCLUDE_LOCATION_GLOBAL:
 		if (ctx->global_location == NULL) {
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 9db3a4ade..8c3588ca9 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -398,10 +398,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location,
 				  storage_r, error_code_r);
 }
 
-static struct sieve_storage *
+static int
 sieve_storage_do_create_personal(struct sieve_instance *svinst,
 				 struct mail_user *user,
 				 enum sieve_storage_flags flags,
+				 struct sieve_storage **storage_r,
 				 enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage = NULL;
@@ -421,14 +422,14 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			e_debug(svinst->event, "storage: "
 				"Personal storage is disabled (sieve=\"\")");
 			*error_code_r = SIEVE_ERROR_NOT_FOUND;
-			return NULL;
+			return -1;
 		}
 
 		data = set_sieve;
 		if ((ret = sieve_storage_driver_parse(svinst, &data,
 						      &sieve_class)) < 0) {
 			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
-			return NULL;
+			return -1;
 		}
 
 		if (ret > 0) {
@@ -436,7 +437,7 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			if (sieve_storage_init(svinst, sieve_class, data,
 					       flags, TRUE,
 					       &storage, error_code_r) < 0)
-				return NULL;
+				return -1;
 		}
 
 		/* No driver name */
@@ -445,12 +446,12 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 	if (storage == NULL) {
 		if (sieve_file_storage_init_default(svinst, set_sieve, flags,
 						    &storage, error_code_r) < 0)
-			return NULL;
+			return -1;
 		i_assert(storage != NULL);
 	}
 
 	if (storage == NULL)
-		return NULL;
+		return -1;
 
 	(void)sieve_storage_sync_init(storage, user);
 
@@ -478,19 +479,22 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 			"Script count limit: %llu scripts",
 			(unsigned long long int) storage->max_scripts);
 	}
-	return storage;
+	*storage_r = storage;
+	return 0;
 }
 
-struct sieve_storage *
-sieve_storage_create_personal(struct sieve_instance *svinst,
-			      struct mail_user *user,
-			      enum sieve_storage_flags flags,
-			      enum sieve_error *error_code_r)
+int sieve_storage_create_personal(struct sieve_instance *svinst,
+				  struct mail_user *user,
+				  enum sieve_storage_flags flags,
+				  struct sieve_storage **storage_r,
+				  enum sieve_error *error_code_r)
 {
-	struct sieve_storage *storage;
+	struct sieve_storage *storage = NULL;
 	const char *set_enabled, *set_default, *set_default_name;
 	enum sieve_error error_code;
+	int ret;
 
+	*storage_r = NULL;
 	if (error_code_r != NULL)
 		*error_code_r = SIEVE_ERROR_NONE;
 	else
@@ -502,16 +506,16 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 		e_debug(svinst->event,
 			"Sieve is disabled for this user");
 		*error_code_r = SIEVE_ERROR_NOT_POSSIBLE;
-		return NULL;
+		return -1;
 	}
 
 	/* Determine location for default script */
 	set_default = sieve_setting_get(svinst, "sieve_default");
 
 	/* Attempt to locate user's main storage */
-	storage = sieve_storage_do_create_personal(svinst, user, flags,
-						   error_code_r);
-	if (storage != NULL) {
+	ret = sieve_storage_do_create_personal(svinst, user, flags,
+					       &storage, error_code_r);
+	if (ret == 0) {
 		/* Success; record default script location for later use */
 		storage->default_location =
 			p_strdup_empty(storage->pool, set_default);
@@ -548,8 +552,9 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 				"Trying default script location '%s'",
 				set_default);
 
-			if (sieve_storage_create(svinst, set_default, 0,
-						 &storage, error_code_r) < 0) {
+			ret = sieve_storage_create(svinst, set_default, 0,
+						   &storage, error_code_r);
+			if (ret < 0) {
 				switch (*error_code_r) {
 				case SIEVE_ERROR_NOT_FOUND:
 					e_debug(svinst->event, "storage: "
@@ -573,7 +578,8 @@ sieve_storage_create_personal(struct sieve_instance *svinst,
 		if (storage != NULL)
 			storage->is_default = TRUE;
 	}
-	return storage;
+	*storage_r = storage;
+	return ret;
 }
 
 void sieve_storage_ref(struct sieve_storage *storage)
diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h
index a4ad97346..ffb25a086 100644
--- a/src/lib-sieve/sieve-storage.h
+++ b/src/lib-sieve/sieve-storage.h
@@ -29,11 +29,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location,
 			 enum sieve_storage_flags flags,
 			 struct sieve_storage **storage_r,
 			 enum sieve_error *error_code_r);
-struct sieve_storage *
-sieve_storage_create_personal(struct sieve_instance *svinst,
-			      struct mail_user *user,
-			      enum sieve_storage_flags flags,
-			      enum sieve_error *error_code_r);
+int sieve_storage_create_personal(struct sieve_instance *svinst,
+				  struct mail_user *user,
+				  enum sieve_storage_flags flags,
+				  struct sieve_storage **storage_r,
+				  enum sieve_error *error_code_r);
 
 void sieve_storage_ref(struct sieve_storage *storage);
 void sieve_storage_unref(struct sieve_storage **_storage);
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index f6627d8ac..3a23226fb 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -71,10 +71,9 @@ client_get_storage(struct sieve_instance *svinst, struct event *event,
 
 	/* Open personal script storage */
 
-	storage = sieve_storage_create_personal(svinst, user,
-						SIEVE_STORAGE_FLAG_READWRITE,
-						&error_code);
-	if (storage == NULL) {
+	if (sieve_storage_create_personal(svinst, user,
+					  SIEVE_STORAGE_FLAG_READWRITE,
+					  &storage, &error_code) < 0) {
 		switch (error_code) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 			byemsg = "BYE \"Sieve processing is disabled for this user.\"\r\n";
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index c851e5f28..7d98d1e02 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -116,9 +116,9 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 		       user->set->mail_debug, &ctx->svinst) < 0)
 		return -1;
 
-	ctx->storage = sieve_storage_create_personal(
-		ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error_code);
-	if (ctx->storage == NULL) {
+	if (sieve_storage_create_personal(ctx->svinst, user,
+					  SIEVE_STORAGE_FLAG_READWRITE,
+					  &ctx->storage, &error_code) < 0) {
 		switch (error_code) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 			error_code = SIEVE_ERROR_NOT_FOUND;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 3d23e8e76..64c4d326e 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -98,10 +98,9 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r)
 		       user->set->mail_debug, &suser->svinst) < 0)
 		return -1;
 
-	suser->sieve_storage =
-		sieve_storage_create_personal(suser->svinst, user,
-					      storage_flags, &error_code);
-	if (suser->sieve_storage == NULL) {
+	if (sieve_storage_create_personal(suser->svinst, user, storage_flags,
+					  &suser->sieve_storage,
+					  &error_code) < 0) {
 		switch (error_code) {
 		/* Sieve disabled for user */
 		case SIEVE_ERROR_NOT_POSSIBLE:
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index c77220e21..eb2c9caa0 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -189,10 +189,9 @@ imap_filter_sieve_get_personal_storage(struct imap_filter_sieve_context *sctx,
 		return -1;
 	}
 
-	ifsuser->storage = sieve_storage_create_personal(svinst, user,
-							 storage_flags,
-							 &error_code);
-	if (ifsuser->storage != NULL) {
+	if (sieve_storage_create_personal(svinst, user, storage_flags,
+					  &ifsuser->storage,
+					  &error_code) == 0) {
 		*storage_r = ifsuser->storage;
 		return 0;
 	}
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 935a6f897..54631d701 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -143,10 +143,8 @@ imap_sieve_get_storage(struct imap_sieve *isieve,
 		return -1;
 	}
 
-	isieve->storage = sieve_storage_create_personal(isieve->svinst, user,
-							storage_flags,
-							&error_code);
-	if (isieve->storage == NULL) {
+	if (sieve_storage_create_personal(isieve->svinst, user, storage_flags,
+					  &isieve->storage, &error_code) < 0) {
 		if (error_code == SIEVE_ERROR_TEMP_FAILURE)
 			return -1;
 		return 0;
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 3695574d1..8dba440d9 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -256,9 +256,8 @@ lda_sieve_get_personal_storage(struct sieve_instance *svinst,
 			       struct sieve_storage **storage_r,
 			       enum sieve_error *error_code_r)
 {
-	*storage_r = sieve_storage_create_personal(svinst, user, 0,
-						   error_code_r);
-	if (*storage_r == NULL) {
+	if (sieve_storage_create_personal(svinst, user, 0,
+					  storage_r, error_code_r) < 0) {
 		switch (*error_code_r) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 		case SIEVE_ERROR_NOT_FOUND:
-- 
GitLab