From 93472b9d8ea9f2c99ad8a2851fdf6e93c6035747 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Mon, 2 Sep 2024 04:03:46 +0200
Subject: [PATCH] lib-sieve: sieve-script - Pass error code only through
 storage object

---
 src/lib-sieve/sieve-script-private.h          | 19 ++---
 src/lib-sieve/sieve-script.c                  | 69 ++++++++++++-------
 src/lib-sieve/sieve-storage-private.h         |  6 +-
 .../storage/data/sieve-data-script.c          |  4 +-
 .../storage/dict/sieve-dict-script.c          | 36 +++-------
 .../storage/dict/sieve-dict-storage.c         |  7 +-
 .../storage/dict/sieve-dict-storage.h         |  9 +--
 .../storage/file/sieve-file-script-sequence.c |  9 +--
 .../storage/file/sieve-file-script.c          | 46 ++++---------
 .../storage/file/sieve-file-storage.h         |  6 +-
 .../storage/ldap/sieve-ldap-script.c          | 34 +++------
 .../storage/ldap/sieve-ldap-storage.h         |  6 +-
 12 files changed, 100 insertions(+), 151 deletions(-)

diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h
index 7ba42e12a..475465f13 100644
--- a/src/lib-sieve/sieve-script-private.h
+++ b/src/lib-sieve/sieve-script-private.h
@@ -11,12 +11,9 @@
 struct sieve_script_vfuncs {
 	void (*destroy)(struct sieve_script *script);
 
-	int (*open)(struct sieve_script *script,
-		    enum sieve_error *error_code_r);
-
+	int (*open)(struct sieve_script *script);
 	int (*get_stream)(struct sieve_script *script,
-			  struct istream **stream_r,
-			  enum sieve_error *error_code_r);
+			  struct istream **stream_r);
 
 	/* binary */
 	int (*binary_read_metadata)(struct sieve_script *_script,
@@ -29,11 +26,9 @@ struct sieve_script_vfuncs {
 				     struct sieve_binary_block *sblock,
 				     sieve_size_t *offset);
 	int (*binary_load)(struct sieve_script *script,
-			   struct sieve_binary **sbin_r,
-			   enum sieve_error *error_code_r);
+			   struct sieve_binary **sbin_r);
 	int (*binary_save)(struct sieve_script *script,
-			   struct sieve_binary *sbin, bool update,
-			   enum sieve_error *error_code_r);
+			   struct sieve_binary *sbin, bool update);
 	const char *(*binary_get_prefix)(struct sieve_script *script);
 
 	/* management */
@@ -80,13 +75,11 @@ void sieve_script_init(struct sieve_script *script,
 
 int sieve_script_binary_load_default(struct sieve_script *script,
 				     const char *path,
-				     struct sieve_binary **sbin_r,
-				     enum sieve_error *error_code_r);
+				     struct sieve_binary **sbin_r);
 int sieve_script_binary_save_default(struct sieve_script *script,
 				     struct sieve_binary *sbin,
 				     const char *path, bool update,
-				     mode_t save_mode,
-				     enum sieve_error *error_code_r);
+				     mode_t save_mode);
 
 /*
  * Built-in script drivers
diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 299dd23a5..7871763e8 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -178,10 +178,14 @@ int sieve_script_open(struct sieve_script *script,
 	if (script->open)
 		return 0;
 
-	ret = script->v.open(script, error_code_r);
+	ret = script->v.open(script);
 	i_assert(ret <= 0);
-	if (ret < 0)
+	if (ret < 0) {
+		i_assert(storage->error_code != SIEVE_ERROR_NONE);
+		i_assert(storage->error != NULL);
+		*error_code_r = storage->error_code;
 		return -1;
+	}
 
 	i_assert(script->location != NULL);
 	i_assert(script->name != NULL);
@@ -319,11 +323,12 @@ int sieve_script_get_stream(struct sieve_script *script,
 	i_assert(script->open);
 
 	T_BEGIN {
-		ret = script->v.get_stream(script, &script->stream,
-					   error_code_r);
+		ret = script->v.get_stream(script, &script->stream);
 	} T_END;
 
 	if (ret < 0) {
+		*error_code_r = storage->error_code;
+
 		struct event_passthrough *e =
 			event_create_passthrough(script->event)->
 			add_str("error", storage->error)->
@@ -506,8 +511,7 @@ bool sieve_script_binary_dump_metadata(struct sieve_script *script,
 
 int sieve_script_binary_load_default(struct sieve_script *script,
 				     const char *path,
-				     struct sieve_binary **sbin_r,
-				     enum sieve_error *error_code_r)
+				     struct sieve_binary **sbin_r)
 {
 	struct sieve_instance *svinst = script->storage->svinst;
 	enum sieve_error error_code;
@@ -516,14 +520,12 @@ int sieve_script_binary_load_default(struct sieve_script *script,
 		sieve_script_set_error(
 			script, SIEVE_ERROR_NOT_POSSIBLE,
 			"Cannot load script binary for this storage");
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 
 	if (sieve_binary_open(svinst, path, script, sbin_r, &error_code) < 0) {
 		sieve_script_set_error(script, error_code,
 				       "Failed to load script binary");
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 	return 0;
@@ -541,21 +543,27 @@ int sieve_script_binary_load(struct sieve_script *script,
 	sieve_storage_clear_error(storage);
 
 	if (script->v.binary_load == NULL) {
-		*error_code_r = SIEVE_ERROR_NOT_POSSIBLE;
-		return -1;
+		sieve_script_set_error(
+			script, SIEVE_ERROR_NOT_POSSIBLE,
+			"Cannot load script binary for this storage type");
+		ret = -1;
+	} else {
+		ret = script->v.binary_load(script, sbin_r);
+		i_assert(ret <= 0);
+		i_assert(ret < 0 || *sbin_r != NULL);
 	}
 
-	ret = script->v.binary_load(script, sbin_r, error_code_r);
-	i_assert(ret <= 0);
-	i_assert(ret < 0 || *sbin_r != NULL);
-	return ret;
+	if (ret < 0) {
+		*error_code_r = script->storage->error_code;
+		return -1;
+	}
+	return 0;
 }
 
 int sieve_script_binary_save_default(struct sieve_script *script ATTR_UNUSED,
 				     struct sieve_binary *sbin,
 				     const char *path, bool update,
-				     mode_t save_mode,
-				     enum sieve_error *error_code_r)
+				     mode_t save_mode)
 {
 	struct sieve_storage *storage = script->storage;
 	enum sieve_error error_code;
@@ -565,23 +573,19 @@ int sieve_script_binary_save_default(struct sieve_script *script ATTR_UNUSED,
 		sieve_script_set_error(
 			script, SIEVE_ERROR_NOT_POSSIBLE,
 			"Cannot save script binary for this storage");
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 
 	if (storage->bin_path != NULL &&
 	    str_begins_with(path, storage->bin_path) &&
 	    sieve_storage_setup_bin_path(
-		script->storage, mkdir_get_executable_mode(save_mode)) < 0) {
-		*error_code_r = script->storage->error_code;
+		script->storage, mkdir_get_executable_mode(save_mode)) < 0)
 		return -1;
-	}
 
 	ret = sieve_binary_save(sbin, path, update, save_mode, &error_code);
 	if (ret < 0) {
 		sieve_script_set_error(script, error_code,
 				       "Failed to save script binary");
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 	return 0;
@@ -593,6 +597,7 @@ int sieve_script_binary_save(struct sieve_script *script,
 {
 	struct sieve_storage *storage = script->storage;
 	struct sieve_script *bin_script = sieve_binary_script(sbin);
+	int ret;
 
 	sieve_error_args_init(&error_code_r, NULL);
 	sieve_storage_clear_error(storage);
@@ -600,11 +605,19 @@ int sieve_script_binary_save(struct sieve_script *script,
 	i_assert(bin_script == NULL || sieve_script_equals(bin_script, script));
 
 	if (script->v.binary_save == NULL) {
-		*error_code_r = SIEVE_ERROR_NOT_POSSIBLE;
-		return -1;
+		sieve_script_set_error(
+			script, SIEVE_ERROR_NOT_POSSIBLE,
+			"Cannot save script binary for this storage type");
+		ret = -1;
+	} else {
+		ret = script->v.binary_save(script, sbin, update);
 	}
 
-	return script->v.binary_save(script, sbin, update, error_code_r);
+	if (ret < 0) {
+		*error_code_r = script->storage->error_code;
+		return -1;
+	}
+	return 0;
 }
 
 const char *sieve_script_binary_get_prefix(struct sieve_script *script)
@@ -952,7 +965,8 @@ int sieve_script_sequence_create(struct sieve_instance *svinst,
 	sseq->storage = storage;
 
 	i_assert(storage->v.script_sequence_init != NULL);
-        ret = storage->v.script_sequence_init(sseq, error_code_r);
+        ret = storage->v.script_sequence_init(sseq);
+	*error_code_r = storage->error_code;
 
 	*sseq_r = sseq;
 	return ret;
@@ -963,13 +977,16 @@ int sieve_script_sequence_next(struct sieve_script_sequence *sseq,
 			       enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage = sseq->storage;
+	int ret;
 
 	*script_r = NULL;
 	sieve_error_args_init(&error_code_r, NULL);
 	sieve_storage_clear_error(storage);
 
 	i_assert(storage->v.script_sequence_next != NULL);
-	return storage->v.script_sequence_next(sseq, script_r, error_code_r);
+	ret = storage->v.script_sequence_next(sseq, script_r);
+	*error_code_r = storage->error_code;
+	return ret;
 }
 
 void sieve_script_sequence_free(struct sieve_script_sequence **_sseq)
diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index 81bd130b8..695b0f9bd 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -37,11 +37,9 @@ struct sieve_storage_vfuncs {
 			  struct sieve_script **script_r);
 
 	/* script sequence */
-	int (*script_sequence_init)(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r);
+	int (*script_sequence_init)(struct sieve_script_sequence *sseq);
 	int (*script_sequence_next)(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r);
+				    struct sieve_script **script_r);
 	void (*script_sequence_destroy)(struct sieve_script_sequence *sseq);
 
 	/* active script */
diff --git a/src/lib-sieve/storage/data/sieve-data-script.c b/src/lib-sieve/storage/data/sieve-data-script.c
index 3bc6774cd..1162b38f1 100644
--- a/src/lib-sieve/storage/data/sieve-data-script.c
+++ b/src/lib-sieve/storage/data/sieve-data-script.c
@@ -66,8 +66,7 @@ static void sieve_data_script_destroy(struct sieve_script *script)
 
 static int
 sieve_data_script_get_stream(struct sieve_script *script,
-			     struct istream **stream_r,
-			     enum sieve_error *error_code_r)
+			     struct istream **stream_r)
 {
 	struct sieve_data_script *dscript =
 		container_of(script, struct sieve_data_script, script);
@@ -76,7 +75,6 @@ sieve_data_script_get_stream(struct sieve_script *script,
 	i_stream_seek(dscript->data, 0);
 
 	*stream_r = dscript->data;
-	*error_code_r = SIEVE_ERROR_NONE;
 	return 0;
 }
 
diff --git a/src/lib-sieve/storage/dict/sieve-dict-script.c b/src/lib-sieve/storage/dict/sieve-dict-script.c
index dcd062487..4448c003f 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-script.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-script.c
@@ -61,9 +61,7 @@ static void sieve_dict_script_destroy(struct sieve_script *script)
 		pool_unref(&dscript->data_pool);
 }
 
-static int
-sieve_dict_script_open(struct sieve_script *script,
-		       enum sieve_error *error_code_r)
+static int sieve_dict_script_open(struct sieve_script *script)
 {
 	struct sieve_storage *storage = script->storage;
 	struct sieve_instance *svinst = storage->svinst;
@@ -75,8 +73,7 @@ sieve_dict_script_open(struct sieve_script *script,
 	const char *path, *data_id, *error;
 	int ret;
 
-	if (sieve_dict_storage_get_dict(dstorage, &dscript->dict,
-					error_code_r) < 0)
+	if (sieve_dict_storage_get_dict(dstorage, &dscript->dict) < 0)
 		return -1;
 
 	path = t_strconcat(DICT_SIEVE_NAME_PATH,
@@ -92,14 +89,10 @@ sieve_dict_script_open(struct sieve_script *script,
 			sieve_script_set_critical(script,
 				"Failed to lookup script id from path %s: %s",
 				path, error);
-			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		} else {
 			e_debug(script->event,
 				"Script '%s' not found at path %s", name, path);
-			sieve_script_set_error(script, SIEVE_ERROR_NOT_FOUND,
-					       "Sieve script '%s' not found",
-					       name);
-			*error_code_r = SIEVE_ERROR_NOT_FOUND;
+			sieve_script_set_not_found_error(script, name);
 		}
 		return -1;
 	}
@@ -110,8 +103,7 @@ sieve_dict_script_open(struct sieve_script *script,
 
 static int
 sieve_dict_script_get_stream(struct sieve_script *script,
-			     struct istream **stream_r,
-			     enum sieve_error *error_code_r)
+			     struct istream **stream_r)
 {
 	struct sieve_storage *storage = script->storage;
 	struct sieve_instance *svinst = storage->svinst;
@@ -142,7 +134,6 @@ sieve_dict_script_get_stream(struct sieve_script *script,
 				"Data with id '%s' for script '%s' not found at path %s",
 				dscript->data_id, name, path);
 		}
-		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		return -1;
 	}
 
@@ -226,28 +217,25 @@ sieve_dict_script_get_bin_path(struct sieve_dict_script *dscript)
 
 static int
 sieve_dict_script_binary_load(struct sieve_script *script,
-			      struct sieve_binary **sbin_r,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary **sbin_r)
 {
 	struct sieve_dict_script *dscript =
 		container_of(script, struct sieve_dict_script, script);
 
 	return sieve_script_binary_load_default(
-		script, sieve_dict_script_get_bin_path(dscript),
-		sbin_r, error_code_r);
+		script, sieve_dict_script_get_bin_path(dscript), sbin_r);
 }
 
 static int
 sieve_dict_script_binary_save(struct sieve_script *script,
-			      struct sieve_binary *sbin, bool update,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary *sbin, bool update)
 {
 	struct sieve_dict_script *dscript =
 		container_of(script, struct sieve_dict_script, script);
 
 	return sieve_script_binary_save_default(
 		script, sbin, sieve_dict_script_get_bin_path(dscript),
-		update, 0600, error_code_r);
+		update, 0600);
 }
 
 static int
@@ -297,8 +285,7 @@ struct sieve_dict_script_sequence {
 	bool done:1;
 };
 
-int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r ATTR_UNUSED)
+int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq)
 {
 	struct sieve_dict_script_sequence *dseq;
 
@@ -310,8 +297,7 @@ int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq,
 }
 
 int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r)
+				    struct sieve_script **script_r)
 {
 	struct sieve_dict_script_sequence *dseq = sseq->storage_data;
 	struct sieve_storage *storage = sseq->storage;
@@ -324,7 +310,7 @@ int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
 	dseq->done = TRUE;
 
 	dscript = sieve_dict_script_init(dstorage, storage->script_name);
-	if (sieve_script_open(&dscript->script, error_code_r) < 0) {
+	if (sieve_script_open(&dscript->script, NULL) < 0) {
 		struct sieve_script *script = &dscript->script;
 
 		sieve_script_unref(&script);
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c
index 2d65a6765..d94ebdd5a 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c
@@ -73,10 +73,8 @@ sieve_dict_storage_init(struct sieve_storage *storage,
 	return 0;
 }
 
-int
-sieve_dict_storage_get_dict(struct sieve_dict_storage *dstorage,
-			    struct dict **dict_r,
-			    enum sieve_error *error_code_r)
+int sieve_dict_storage_get_dict(struct sieve_dict_storage *dstorage,
+				struct dict **dict_r)
 {
 	struct sieve_storage *storage = &dstorage->storage;
 	struct sieve_instance *svinst = storage->svinst;
@@ -93,7 +91,6 @@ sieve_dict_storage_get_dict(struct sieve_dict_storage *dstorage,
 			sieve_storage_set_critical(storage,
 				"Failed to initialize dict with data '%s' for user '%s': %s",
 				dstorage->uri, svinst->username, error);
-			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 			return -1;
 		}
 	}
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.h b/src/lib-sieve/storage/dict/sieve-dict-storage.h
index be5f269f2..b53edf441 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.h
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.h
@@ -24,8 +24,7 @@ struct sieve_dict_storage {
 };
 
 int sieve_dict_storage_get_dict(struct sieve_dict_storage *dstorage,
-				struct dict **dict_r,
-				enum sieve_error *error_code_r);
+				struct dict **dict_r);
 
 int sieve_dict_storage_active_script_get_name(struct sieve_storage *storage,
 					      const char **name_r);
@@ -53,11 +52,9 @@ sieve_dict_script_init(struct sieve_dict_storage *dstorage, const char *name);
  * Script sequence
  */
 
-int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r);
+int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq);
 int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r);
+				    struct sieve_script **script_r);
 void sieve_dict_script_sequence_destroy(struct sieve_script_sequence *sseq);
 
 #endif
diff --git a/src/lib-sieve/storage/file/sieve-file-script-sequence.c b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
index fba7f7ba1..b6fe1745d 100644
--- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c
+++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
@@ -123,8 +123,7 @@ sieve_file_script_sequence_read_dir(struct sieve_script_sequence *sseq,
 	return ret;
 }
 
-int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r)
+int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq)
 {
 	struct sieve_storage *storage = sseq->storage;
 	struct sieve_file_storage *fstorage =
@@ -157,7 +156,6 @@ int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
 				"stat(%s) failed: %m", fstorage->path);
 			break;
 		}
-		*error_code_r = storage->error_code;
 		return -1;
 	}
 
@@ -175,7 +173,6 @@ int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
 			/* Read all '.sieve' files in directory */
 			if (sieve_file_script_sequence_read_dir(
 				sseq, fseq, fstorage->path) < 0) {
-				*error_code_r = storage->error_code;
 				pool_unref(&fseq->pool);
 				return -1;
 			}
@@ -197,8 +194,7 @@ int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
 }
 
 int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r)
+				    struct sieve_script **script_r)
 {
 	struct sieve_file_script_sequence *fseq = sseq->storage_data;
 	struct sieve_storage *storage = sseq->storage;
@@ -240,7 +236,6 @@ int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 	if (ret < 0) {
 		if (storage->error_code == SIEVE_ERROR_NOT_FOUND)
 			return 0;
-		*error_code_r = storage->error_code;
 		return -1;
 	}
 	*script_r = &fscript->script;
diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c
index a416fbe79..babe5b419 100644
--- a/src/lib-sieve/storage/file/sieve-file-script.c
+++ b/src/lib-sieve/storage/file/sieve-file-script.c
@@ -53,8 +53,7 @@ const char *sieve_script_file_from_name(const char *name)
 static void
 sieve_file_script_handle_error(struct sieve_file_script *fscript,
 			       const char *op, const char *path,
-			       const char *name,
-			       enum sieve_error *error_code_r)
+			       const char *name)
 {
 	struct sieve_script *script = &fscript->script;
 	const char *abspath, *error;
@@ -62,28 +61,24 @@ sieve_file_script_handle_error(struct sieve_file_script *fscript,
 	switch (errno) {
 	case ENOENT:
 		if (t_abspath(path, &abspath, &error) < 0) {
-			sieve_script_set_error(script, SIEVE_ERROR_TEMP_FAILURE,
-					       "t_abspath(%s) failed: %s",
-					       path, error);
-			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
+			sieve_script_set_critical(script,
+						  "t_abspath(%s) failed: %s",
+						  path, error);
 			break;
 		}
 		e_debug(script->event, "File '%s' not found", abspath);
-		sieve_script_set_error(script, SIEVE_ERROR_NOT_FOUND,
-				       "Sieve script '%s' not found", name);
-		*error_code_r = SIEVE_ERROR_NOT_FOUND;
+		sieve_script_set_not_found_error(script, name);
 		break;
 	case EACCES:
 		sieve_script_set_critical(script,
 					  "Failed to %s sieve script: %s",
 					  op, eacces_error_get(op, path));
-		*error_code_r = SIEVE_ERROR_NO_PERMISSION;
+		script->storage->error_code = SIEVE_ERROR_NO_PERMISSION;
 		break;
 	default:
 		sieve_script_set_critical(
 			script, "Failed to %s sieve script: %s(%s) failed: %m",
 			op, op, path);
-		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		break;
 	}
 }
@@ -294,9 +289,7 @@ path_split_filename(const char *path, const char **dir_path_r)
 	return filename;
 }
 
-static int
-sieve_file_script_open(struct sieve_script *script,
-		       enum sieve_error *error_code_r)
+static int sieve_file_script_open(struct sieve_script *script)
 {
 	struct sieve_file_script *fscript =
 		container_of(script, struct sieve_file_script, script);
@@ -333,7 +326,6 @@ sieve_file_script_open(struct sieve_script *script,
 			if (filename == NULL || *filename == '\0') {
 				sieve_script_set_critical(
 					script, "Sieve script file path '%s' is a directory.", path);
-				*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 				success = FALSE;
 			} else {
 				/* Extend storage path with filename */
@@ -374,16 +366,14 @@ sieve_file_script_open(struct sieve_script *script,
 					i_assert(basename != NULL);
 					name = basename;
 				}
-				sieve_file_script_handle_error(
-					fscript, "stat", path, name,
-					error_code_r);
+				sieve_file_script_handle_error(fscript, "stat",
+							       path, name);
 				success = FALSE;
 
 			} else if (!S_ISREG(st.st_mode)) {
 				sieve_script_set_critical(
 					script, "Sieve script file '%s' is not a regular file.",
 					path);
-				*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 				success = FALSE;
 			}
 		}
@@ -433,8 +423,7 @@ sieve_file_script_open(struct sieve_script *script,
 
 static int
 sieve_file_script_get_stream(struct sieve_script *script,
-			     struct istream **stream_r,
-			     enum sieve_error *error_code_r)
+			     struct istream **stream_r)
 {
 	struct sieve_file_script *fscript =
 		container_of(script, struct sieve_file_script, script);
@@ -445,8 +434,7 @@ sieve_file_script_get_stream(struct sieve_script *script,
 	fd = open(fscript->path, O_RDONLY);
 	if (fd < 0) {
 		sieve_file_script_handle_error(fscript, "open", fscript->path,
-					       fscript->script.name,
-					       error_code_r);
+					       fscript->script.name);
 		return -1;
 	}
 
@@ -455,14 +443,12 @@ sieve_file_script_get_stream(struct sieve_script *script,
 			script,
 			"Failed to open sieve script: fstat(fd=%s) failed: %m",
 			fscript->path);
-		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		result = NULL;
 	/* Re-check the file type just to be sure */
 	} else if (!S_ISREG(st.st_mode)) {
 		sieve_script_set_critical(
 			script,	"Sieve script file '%s' is not a regular file",
 			fscript->path);
-		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		result = NULL;
 	} else {
 		result = i_stream_create_fd_autoclose(
@@ -532,27 +518,25 @@ sieve_file_script_binary_read_metadata(struct sieve_script *script,
 
 static int
 sieve_file_script_binary_load(struct sieve_script *script,
-			      struct sieve_binary **sbin_r,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary **sbin_r)
 {
 	struct sieve_file_script *fscript =
 		container_of(script, struct sieve_file_script, script);
 
 	return sieve_script_binary_load_default(script, fscript->bin_path,
-						sbin_r, error_code_r);
+						sbin_r);
 }
 
 static int
 sieve_file_script_binary_save(struct sieve_script *script,
-			      struct sieve_binary *sbin, bool update,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary *sbin, bool update)
 {
 	struct sieve_file_script *fscript =
 		container_of(script, struct sieve_file_script, script);
 
 	return sieve_script_binary_save_default(
 		script, sbin, fscript->bin_path, update,
-		(fscript->st.st_mode & 0777), error_code_r);
+		(fscript->st.st_mode & 0777));
 }
 
 static const char *
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index da614455d..eac2d98f1 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -172,11 +172,9 @@ const char *sieve_file_script_get_path(const struct sieve_script *script);
  * Script sequence
  */
 
-int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r);
+int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq);
 int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r);
+				    struct sieve_script **script_r);
 void sieve_file_script_sequence_destroy(struct sieve_script_sequence *sseq);
 
 #endif
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
index 3f416daa5..374b8d0db 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
@@ -54,8 +54,7 @@ sieve_ldap_script_init(struct sieve_ldap_storage *lstorage, const char *name)
 }
 
 static int
-sieve_ldap_script_open(struct sieve_script *script,
-		       enum sieve_error *error_code_r)
+sieve_ldap_script_open(struct sieve_script *script)
 {
 	struct sieve_ldap_script *lscript =
 		container_of(script, struct sieve_ldap_script, script);
@@ -67,7 +66,6 @@ sieve_ldap_script_open(struct sieve_script *script,
 	if (sieve_ldap_db_connect(lstorage->conn) < 0) {
 		sieve_storage_set_critical(
 			storage, "Failed to connect to LDAP database");
-		*error_code_r = storage->error_code;
 		return -1;
 	}
 
@@ -76,12 +74,10 @@ sieve_ldap_script_open(struct sieve_script *script,
 	if (ret <= 0) {
 		if (ret == 0) {
 			e_debug(script->event, "Script entry not found");
-			sieve_script_set_error(script, SIEVE_ERROR_NOT_FOUND,
-					       "Sieve script not found");
+			sieve_script_set_not_found_error(script, NULL);
 		} else {
 			sieve_script_set_internal_error(script);
 		}
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 
@@ -90,8 +86,7 @@ sieve_ldap_script_open(struct sieve_script *script,
 
 static int
 sieve_ldap_script_get_stream(struct sieve_script *script,
-			     struct istream **stream_r,
-			     enum sieve_error *error_code_r)
+			     struct istream **stream_r)
 {
 	struct sieve_ldap_script *lscript =
 		container_of(script, struct sieve_ldap_script, script);
@@ -106,12 +101,10 @@ sieve_ldap_script_get_stream(struct sieve_script *script,
 	if (ret <= 0) {
 		if (ret == 0) {
 			e_debug(script->event, "Script attribute not found");
-			sieve_script_set_error(script, SIEVE_ERROR_NOT_FOUND,
-					       "Sieve script not found");
+			sieve_script_set_not_found_error(script, NULL);
 		} else {
 			sieve_script_set_internal_error(script);
 		}
-		*error_code_r = script->storage->error_code;
 		return -1;
 	}
 	return 0;
@@ -248,28 +241,25 @@ sieve_ldap_script_get_bin_path(struct sieve_ldap_script *lscript)
 
 static int
 sieve_ldap_script_binary_load(struct sieve_script *script,
-			      struct sieve_binary **sbin_r,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary **sbin_r)
 {
 	struct sieve_ldap_script *lscript =
 		container_of(script, struct sieve_ldap_script, script);
 
 	return sieve_script_binary_load_default(
-		script, sieve_ldap_script_get_bin_path(lscript),
-		sbin_r, error_code_r);
+		script, sieve_ldap_script_get_bin_path(lscript), sbin_r);
 }
 
 static int
 sieve_ldap_script_binary_save(struct sieve_script *script,
-			      struct sieve_binary *sbin, bool update,
-			      enum sieve_error *error_code_r)
+			      struct sieve_binary *sbin, bool update)
 {
 	struct sieve_ldap_script *lscript =
 		container_of(script, struct sieve_ldap_script, script);
 
 	return sieve_script_binary_save_default(
 		script, sbin, sieve_ldap_script_get_bin_path(lscript),
-		update, 0600, error_code_r);
+		update, 0600);
 }
 
 static int
@@ -312,8 +302,7 @@ struct sieve_ldap_script_sequence {
 	bool done:1;
 };
 
-int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r ATTR_UNUSED)
+int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq)
 {
 	struct sieve_ldap_script_sequence *lseq = NULL;
 
@@ -325,8 +314,7 @@ int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq,
 }
 
 int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r)
+				    struct sieve_script **script_r)
 {
 	struct sieve_ldap_script_sequence *lseq = sseq->storage_data;
 	struct sieve_storage *storage = sseq->storage;
@@ -339,7 +327,7 @@ int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
 	lseq->done = TRUE;
 
 	lscript = sieve_ldap_script_init(lstorage, storage->script_name);
-	if (sieve_script_open(&lscript->script, error_code_r) < 0) {
+	if (sieve_script_open(&lscript->script, NULL) < 0) {
 		struct sieve_script *script = &lscript->script;
 
 		sieve_script_unref(&script);
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
index a05513146..703805628 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
@@ -59,11 +59,9 @@ sieve_ldap_script_init(struct sieve_ldap_storage *lstorage, const char *name);
  * Script sequence
  */
 
-int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq,
-				    enum sieve_error *error_code_r);
+int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq);
 int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
-				    struct sieve_script **script_r,
-				    enum sieve_error *error_code_r);
+				    struct sieve_script **script_r);
 void sieve_ldap_script_sequence_destroy(struct sieve_script_sequence *sseq);
 
 #endif
-- 
GitLab