From f690d141d557d5085516140c8fe40a6e5bb0b80d Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sat, 12 Oct 2024 16:10:35 +0200
Subject: [PATCH] lib-sieve: plugins: copy: Use int for
 sieve_ext_copy_get_extension() status result

---
 src/lib-sieve/plugins/copy/sieve-ext-copy.h           |  9 ++++++---
 .../sieve-extprograms/sieve-extprograms-common.c      | 11 ++++++-----
 2 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/lib-sieve/plugins/copy/sieve-ext-copy.h b/src/lib-sieve/plugins/copy/sieve-ext-copy.h
index faf19dcb5..c550cadbd 100644
--- a/src/lib-sieve/plugins/copy/sieve-ext-copy.h
+++ b/src/lib-sieve/plugins/copy/sieve-ext-copy.h
@@ -1,13 +1,16 @@
 #ifndef SIEVE_EXT_COPY_H
 #define SIEVE_EXT_COPY_H
 
+extern const struct sieve_extension_def copy_extension;
+
 /* sieve_ext_copy_get_extension():
  *   Get the extension struct for the copy extension.
  */
-static inline const struct sieve_extension *sieve_ext_copy_get_extension
-(struct sieve_instance *svinst)
+static inline int
+sieve_ext_copy_get_extension(struct sieve_instance *svinst,
+			     const struct sieve_extension **ext_r)
 {
-	return sieve_extension_get_by_name(svinst, "copy");
+	return sieve_extension_register(svinst, &copy_extension, FALSE, ext_r);
 }
 
 /* sieve_ext_copy_register_tag():
diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-common.c b/src/plugins/sieve-extprograms/sieve-extprograms-common.c
index b797383c3..49188ffb8 100644
--- a/src/plugins/sieve-extprograms/sieve-extprograms-common.c
+++ b/src/plugins/sieve-extprograms/sieve-extprograms-common.c
@@ -60,6 +60,7 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 				void **context)
 {
 	struct sieve_instance *svinst = ext->svinst;
+	const struct sieve_extension *copy_ext = NULL;
 	const struct sieve_extension *var_ext = NULL;
 	struct sieve_extprograms_ext_context *extctx;
 	const char *extname = sieve_extension_name(ext);
@@ -82,6 +83,10 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 	input_eol = sieve_setting_get(
 		svinst, t_strdup_printf("sieve_%s_input_eol", extname));
 
+	if (sieve_extension_is(ext, sieve_ext_vnd_pipe)) {
+		if (sieve_ext_copy_get_extension(ext->svinst, &copy_ext) < 0)
+			return FALSE;
+	}
 	if (sieve_extension_is(ext, sieve_ext_vnd_execute)) {
 		if (sieve_ext_variables_get_extension(ext->svinst,
 						      &var_ext) < 0)
@@ -91,6 +96,7 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 	extctx = i_new(struct sieve_extprograms_ext_context, 1);
 	extctx->execute_timeout =
 		SIEVE_EXTPROGRAMS_DEFAULT_EXEC_TIMEOUT_SECS;
+	extctx->copy_ext = copy_ext;
 	extctx->var_ext = var_ext;
 
 	if (bin_dir == NULL && socket_dir == NULL) {
@@ -113,11 +119,6 @@ bool sieve_extprograms_ext_load(const struct sieve_extension *ext,
 		}
 	}
 
-	if (sieve_extension_is(ext, sieve_ext_vnd_pipe)) {
-		extctx->copy_ext =
-			sieve_ext_copy_get_extension(ext->svinst);
-	}
-
 	*context = extctx;
 	return TRUE;
 }
-- 
GitLab