From eb7e58329c50aeae15962ae681db2226f7d6d7a1 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sat, 28 Sep 2024 19:58:41 +0200
Subject: [PATCH] lib-sieve: sieve - Use int for sieve_compile_script() status
 result

---
 src/lib-sieve/sieve.c                         | 31 +++++++++----------
 src/lib-sieve/sieve.h                         | 10 +++---
 src/managesieve/cmd-putscript.c               |  4 +--
 src/managesieve/cmd-setactive.c               |  5 ++-
 .../doveadm-sieve-cmd-activate.c              |  5 ++-
 .../doveadm-sieve/doveadm-sieve-cmd-put.c     |  5 ++-
 .../imap-filter-sieve/imap-filter-sieve.c     |  5 +--
 src/plugins/imapsieve/imap-sieve.c            |  5 +--
 src/plugins/lda-sieve/lda-sieve-plugin.c      |  6 ++--
 9 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 8a3f44086..3442dbd44 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -251,16 +251,17 @@ sieve_generate(struct sieve_ast *ast, struct sieve_error_handler *ehandler,
  * Sieve compilation
  */
 
-struct sieve_binary *
-sieve_compile_script(struct sieve_script *script,
-		     struct sieve_error_handler *ehandler,
-		     enum sieve_compile_flags flags,
-		     enum sieve_error *error_code_r)
+int sieve_compile_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_ast *ast;
 	struct sieve_binary *sbin;
 	enum sieve_error error_code;
 
+	*sbin_r = NULL;
 	if (error_code_r != NULL)
 		*error_code_r = SIEVE_ERROR_NONE;
 	else
@@ -280,7 +281,7 @@ sieve_compile_script(struct sieve_script *script,
 			sieve_error(ehandler, sieve_script_name(script),
 				    "parse failed");
 		}
-		return NULL;
+		return -1;
 	}
 
 	/* Validate */
@@ -289,7 +290,7 @@ sieve_compile_script(struct sieve_script *script,
 			    "validation failed");
 
  		sieve_ast_unref(&ast);
-		return NULL;
+		return -1;
  	}
 
 	/* Generate */
@@ -298,12 +299,13 @@ sieve_compile_script(struct sieve_script *script,
 		sieve_error(ehandler, sieve_script_name(script),
 			    "code generation failed");
 		sieve_ast_unref(&ast);
-		return NULL;
+		return -1;
 	}
 
 	/* Cleanup */
 	sieve_ast_unref(&ast);
-	return sbin;
+	*sbin_r = sbin;
+	return 0;
 }
 
 int sieve_compile(struct sieve_instance *svinst, const char *script_location,
@@ -312,7 +314,6 @@ int sieve_compile(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;
 
 	*sbin_r = NULL;
@@ -334,8 +335,8 @@ int sieve_compile(struct sieve_instance *svinst, const char *script_location,
 		return -1;
 	}
 
-	sbin = sieve_compile_script(script, ehandler, flags, error_code_r);
-	if (sbin == NULL) {
+	if (sieve_compile_script(script, ehandler, flags,
+				 sbin_r, error_code_r) < 0) {
 		sieve_script_unref(&script);
 		return -1;
 	}
@@ -343,7 +344,6 @@ int sieve_compile(struct sieve_instance *svinst, const char *script_location,
 	e_debug(svinst->event, "Script '%s' from %s successfully compiled",
 		sieve_script_name(script), sieve_script_location(script));
 
-	*sbin_r = sbin;
 	sieve_script_unref(&script);
 	return 0;
 }
@@ -431,9 +431,8 @@ sieve_open_script_real(struct sieve_script *script,
 			"Script binary %s successfully loaded",
 			sieve_binary_path(sbin));
 	} else {
-		sbin = sieve_compile_script(script, ehandler, flags,
-					    error_code_r);
-		if (sbin == NULL)
+		if (sieve_compile_script(script, ehandler, flags,
+					 &sbin, error_code_r) < 0)
 			return NULL;
 
 		e_debug(svinst->event,
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index df838958b..e207d9d13 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -38,11 +38,11 @@ void sieve_set_extensions(struct sieve_instance *svinst,
 
 /* Compile a Sieve script from a Sieve script object. Returns Sieve binary upon
    success and NULL upon failure. */
-struct sieve_binary *
-sieve_compile_script(struct sieve_script *script,
-		     struct sieve_error_handler *ehandler,
-		     enum sieve_compile_flags flags,
-		     enum sieve_error *error_code_r);
+int sieve_compile_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);
 
 /* Compile a Sieve script from a Sieve script location string. Returns Sieve
    binary upon success and NULL upon failure. The provided script_name is used
diff --git a/src/managesieve/cmd-putscript.c b/src/managesieve/cmd-putscript.c
index fe2c2a9c3..4b25a15a9 100644
--- a/src/managesieve/cmd-putscript.c
+++ b/src/managesieve/cmd-putscript.c
@@ -196,8 +196,8 @@ cmd_putscript_finish_script(struct cmd_putscript_context *ctx,
 		client->set->managesieve_max_compile_errors);
 
 	/* Compile */
-	sbin = sieve_compile_script(script, ehandler, cpflags, &error_code);
-	if (sbin == NULL) {
+	if (sieve_compile_script(script, ehandler, cpflags,
+				 &sbin, &error_code) < 0) {
 		const char *errormsg = NULL, *action;
 
 		if (error_code != SIEVE_ERROR_NOT_VALID) {
diff --git a/src/managesieve/cmd-setactive.c b/src/managesieve/cmd-setactive.c
index e0da44a44..49fd9db67 100644
--- a/src/managesieve/cmd-setactive.c
+++ b/src/managesieve/cmd-setactive.c
@@ -50,9 +50,8 @@ cmd_setactive_activate(struct client_command_context *cmd,
 			client->set->managesieve_max_compile_errors);
 
 		/* Compile */
-		sbin = sieve_compile_script(script, ehandler, cpflags,
-					    &error_code);
-		if (sbin == NULL) {
+		if (sieve_compile_script(script, ehandler, cpflags,
+					 &sbin, &error_code) < 0) {
 			if (error_code != SIEVE_ERROR_NOT_VALID) {
 				errormsg = sieve_script_get_last_error(
 					script, &error_code);
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
index 3abe25d7b..a87a9465e 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
@@ -48,9 +48,8 @@ static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx)
 
 		/* Compile */
 		ehandler = sieve_master_ehandler_create(ctx->ctx.svinst, 0);
-		sbin = sieve_compile_script(script, ehandler, cpflags,
-					    &error_code);
-		if (sbin == NULL) {
+		if (sieve_compile_script(script, ehandler, cpflags,
+					 &sbin, &error_code) < 0) {
 			doveadm_sieve_cmd_failed_error(_ctx, error_code);
 			ret = -1;
 		} else {
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
index c4529fd4d..3153e3695 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
@@ -96,9 +96,8 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 			/* Compile */
 			ehandler = sieve_master_ehandler_create(
 				ctx->ctx.svinst, 0);
-			sbin = sieve_compile_script(script, ehandler, cpflags,
-						    &error_code);
-			if (sbin == NULL) {
+			if (sieve_compile_script(script, ehandler, cpflags,
+						 &sbin, &error_code) < 0) {
 				doveadm_sieve_cmd_failed_error(
 					_ctx, error_code);
 				ret = -1;
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 47ba7d976..3b9cd5425 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -382,8 +382,9 @@ imap_sieve_filter_open_script(struct imap_filter_sieve_context *sctx,
 
 	/* Load or compile the sieve script */
 	if (recompile) {
-		sbin = sieve_compile_script(script, ehandler, cpflags,
-					    error_code_r);
+		if (sieve_compile_script(script, ehandler, cpflags,
+					 &sbin, error_code_r) < 0)
+			sbin = NULL;
 	} else {
 		sbin = sieve_open_script(script, ehandler, cpflags,
 					 error_code_r);
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 9e624c180..82e4582ba 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -590,8 +590,9 @@ imap_sieve_run_open_script(struct imap_sieve_run *isrun,
 
 	/* Load or compile the sieve script */
 	if (recompile) {
-		sbin = sieve_compile_script(script, ehandler, cpflags,
-					    error_code_r);
+		if (sieve_compile_script(script, ehandler, cpflags,
+					 &sbin, error_code_r) < 0)
+			sbin = NULL;
 	} else {
 		sbin = sieve_open_script(script, ehandler, cpflags,
 					 error_code_r);
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 7e7a3bf43..569b84b48 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -369,8 +369,10 @@ sieve_binary *lda_sieve_open(struct lda_sieve_run_context *srctx,
 	sieve_error_handler_reset(ehandler);
 
 	if (recompile) {
-		sbin = sieve_compile_script(script, ehandler, cpflags,
-					    error_code_r);
+		if (sieve_compile_script(script, ehandler, cpflags,
+					 &sbin, error_code_r) < 0)
+			sbin = NULL;
+
 	} else {
 		sbin = sieve_open_script(script, ehandler, cpflags,
 					 error_code_r);
-- 
GitLab