From cc171840b280d7e25abf1234cb838ed6dff17ec1 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sat, 28 Sep 2024 20:22:47 +0200
Subject: [PATCH] lib-sieve: sieve - Use int for sieve_open_script() status
 result

---
 src/lib-sieve/sieve.c                         | 50 ++++++++++---------
 src/lib-sieve/sieve.h                         | 10 ++--
 .../imap-filter-sieve/imap-filter-sieve.c     | 12 ++---
 src/plugins/imapsieve/imap-sieve.c            | 12 ++---
 src/plugins/lda-sieve/lda-sieve-plugin.c      | 13 +++--
 5 files changed, 49 insertions(+), 48 deletions(-)

diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index d21f301fb..daa193e9c 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -388,24 +388,19 @@ sieve_load(struct sieve_instance *svinst, const char *bin_path,
 	return sbin;
 }
 
-static struct sieve_binary *
+static int
 sieve_open_script_real(struct sieve_script *script,
 		       struct sieve_error_handler *ehandler,
 		       enum sieve_compile_flags flags,
+		       struct sieve_binary **sbin_r,
 		       enum sieve_error *error_code_r)
 {
 	struct sieve_instance *svinst = sieve_script_svinst(script);
 	struct sieve_resource_usage rusage;
 	struct sieve_binary *sbin;
-	enum sieve_error error_code;
 	const char *error = NULL;
 	int ret;
 
-	if (error_code_r != NULL)
-		*error_code_r = SIEVE_ERROR_NONE;
-	else
-		error_code_r = &error_code;
-
 	sieve_resource_usage_init(&rusage);
 
 	/* Try to open the matching binary */
@@ -433,7 +428,7 @@ sieve_open_script_real(struct sieve_script *script,
 	} else {
 		if (sieve_compile_script(script, ehandler, flags,
 					 &sbin, error_code_r) < 0)
-			return NULL;
+			return -1;
 
 		e_debug(svinst->event,
 			"Script '%s' from %s successfully compiled",
@@ -466,25 +461,34 @@ sieve_open_script_real(struct sieve_script *script,
 				    "%s", error);
 		}
 		sieve_binary_close(&sbin);
+		return -1;
 	}
 
-	return sbin;
+	*sbin_r = sbin;
+	return 0;
 }
 
-struct sieve_binary *
-sieve_open_script(struct sieve_script *script,
-		  struct sieve_error_handler *ehandler,
-		  enum sieve_compile_flags flags,
-		  enum sieve_error *error_code_r)
+int sieve_open_script(struct sieve_script *script,
+		      struct sieve_error_handler *ehandler,
+		      enum sieve_compile_flags flags,
+		      struct sieve_binary **sbin_r,
+		      enum sieve_error *error_code_r)
 {
-	struct sieve_binary *sbin;
+	enum sieve_error error_code;
+	int ret;
+
+	*sbin_r = NULL;
+	if (error_code_r != NULL)
+		*error_code_r = SIEVE_ERROR_NONE;
+	else
+		error_code_r = &error_code;
 
 	T_BEGIN {
-		sbin = sieve_open_script_real(script, ehandler, flags,
-					      error_code_r);
+		ret = sieve_open_script_real(script, ehandler, flags,
+					     sbin_r, error_code_r);
 	} T_END;
 
-	return sbin;
+	return ret;
 }
 
 int sieve_open(struct sieve_instance *svinst, const char *script_location,
@@ -493,8 +497,8 @@ int sieve_open(struct sieve_instance *svinst, const char *script_location,
 	       enum sieve_error *error_code_r)
 {
 	struct sieve_script *script;
-	struct sieve_binary *sbin;
 	enum sieve_error error_code;
+	int ret;
 
 	*sbin_r = NULL;
 	if (error_code_r != NULL)
@@ -517,15 +521,13 @@ int sieve_open(struct sieve_instance *svinst, const char *script_location,
 		return -1;
 	}
 
-	sbin = sieve_open_script(script, ehandler, flags, error_code_r);
-
 	/* Drop script reference, if sbin != NULL it holds a reference of its
 	   own. Otherwise the script object is freed here.
 	 */
+	ret = sieve_open_script(script, ehandler, flags,
+				sbin_r, error_code_r);
 	sieve_script_unref(&script);
-
-	*sbin_r = sbin;
-	return (sbin == NULL ? -1 : 0);
+	return ret;
 }
 
 const char *sieve_get_source(struct sieve_binary *sbin)
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index cb06b2758..3d20d0e82 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -64,11 +64,11 @@ sieve_load(struct sieve_instance *svinst, const char *bin_path,
    not exist or if it contains errors, the script is (re-)compiled. Note that
    errors in the bytecode are caught only at runtime.
  */
-struct sieve_binary *
-sieve_open_script(struct sieve_script *script,
-		  struct sieve_error_handler *ehandler,
-		  enum sieve_compile_flags flags,
-		  enum sieve_error *error_code_r);
+int sieve_open_script(struct sieve_script *script,
+		      struct sieve_error_handler *ehandler,
+		      enum sieve_compile_flags flags,
+		      struct sieve_binary **sbin_r,
+		      enum sieve_error *error_code_r);
 /* First tries to open the binary version of the specified script and if it does
    not exist or if it contains errors, the script is (re-)compiled. Note that
    errors in the bytecode are caught only at runtime.
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 3b9cd5425..c77220e21 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -360,6 +360,7 @@ imap_sieve_filter_open_script(struct imap_filter_sieve_context *sctx,
 	struct sieve_error_handler *ehandler;
 	struct sieve_binary *sbin;
 	const char *compile_name = "compile";
+	int ret;
 
 	i_assert(svinst != NULL);
 
@@ -382,16 +383,15 @@ imap_sieve_filter_open_script(struct imap_filter_sieve_context *sctx,
 
 	/* Load or compile the sieve script */
 	if (recompile) {
-		if (sieve_compile_script(script, ehandler, cpflags,
-					 &sbin, error_code_r) < 0)
-			sbin = NULL;
+		ret = sieve_compile_script(script, ehandler, cpflags,
+					   &sbin, error_code_r);
 	} else {
-		sbin = sieve_open_script(script, ehandler, cpflags,
-					 error_code_r);
+		ret = sieve_open_script(script, ehandler, cpflags,
+					&sbin, error_code_r);
 	}
 
 	/* Handle error */
-	if (sbin == NULL) {
+	if (ret < 0) {
 		switch (*error_code_r) {
 		/* Script not found */
 		case SIEVE_ERROR_NOT_FOUND:
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 82e4582ba..935a6f897 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -570,6 +570,7 @@ imap_sieve_run_open_script(struct imap_sieve_run *isrun,
 	struct sieve_error_handler *ehandler;
 	struct sieve_binary *sbin;
 	const char *compile_name = "compile";
+	int ret;
 
 	if (recompile) {
 		/* Warn */
@@ -590,16 +591,15 @@ imap_sieve_run_open_script(struct imap_sieve_run *isrun,
 
 	/* Load or compile the sieve script */
 	if (recompile) {
-		if (sieve_compile_script(script, ehandler, cpflags,
-					 &sbin, error_code_r) < 0)
-			sbin = NULL;
+		ret = sieve_compile_script(script, ehandler, cpflags,
+					   &sbin, error_code_r);
 	} else {
-		sbin = sieve_open_script(script, ehandler, cpflags,
-					 error_code_r);
+		ret = sieve_open_script(script, ehandler, cpflags,
+					&sbin, error_code_r);
 	}
 
 	/* Handle error */
-	if (sbin == NULL) {
+	if (ret < 0) {
 		switch (*error_code_r) {
 		/* Script not found */
 		case SIEVE_ERROR_NOT_FOUND:
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 569b84b48..3695574d1 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -349,6 +349,7 @@ sieve_binary *lda_sieve_open(struct lda_sieve_run_context *srctx,
 	struct sieve_error_handler *ehandler;
 	struct sieve_binary *sbin;
 	const char *compile_name = "compile";
+	int ret;
 
 	if (recompile) {
 		/* Warn */
@@ -369,17 +370,15 @@ sieve_binary *lda_sieve_open(struct lda_sieve_run_context *srctx,
 	sieve_error_handler_reset(ehandler);
 
 	if (recompile) {
-		if (sieve_compile_script(script, ehandler, cpflags,
-					 &sbin, error_code_r) < 0)
-			sbin = NULL;
-
+		ret = sieve_compile_script(script, ehandler, cpflags,
+					   &sbin, error_code_r);
 	} else {
-		sbin = sieve_open_script(script, ehandler, cpflags,
-					 error_code_r);
+		ret = sieve_open_script(script, ehandler, cpflags,
+					&sbin, error_code_r);
 	}
 
 	/* Load or compile the sieve script */
-	if (sbin == NULL) {
+	if (ret < 0) {
 		switch (*error_code_r) {
 		/* Script not found */
 		case SIEVE_ERROR_NOT_FOUND:
-- 
GitLab