diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index ebba4a12183711cc4d22bbe12ae355fde1098911..589bfd735bb3e9e121b1e282fb06996d4921e662 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -47,8 +47,8 @@ struct sieve_storage_vfuncs {
 	/* active script */
 	int (*active_script_get_name)(struct sieve_storage *storage,
 				      const char **name_r);
-	struct sieve_script *(*active_script_open)(
-		struct sieve_storage *storage);
+	int (*active_script_open)(struct sieve_storage *storage,
+				  struct sieve_script **script_r);
 	int (*deactivate)(struct sieve_storage *storage);
 	int (*active_script_get_last_change)(struct sieve_storage *storage,
 					     time_t *last_change_r);
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 559ac6ba23ec80d6d7388d7a17f65df2d70cb609..29e51bc7b079a30f160961d745ecb6d50881aa49 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -913,34 +913,47 @@ int sieve_storage_active_script_is_default(struct sieve_storage *storage)
 	return (ret < 0 ? -1 : (is_default ? 1 : 0));
 }
 
-struct sieve_script *
-sieve_storage_active_script_open(struct sieve_storage *storage,
-				 enum sieve_error *error_code_r)
+int sieve_storage_active_script_open(struct sieve_storage *storage,
+				     struct sieve_script **script_r,
+				     enum sieve_error *error_code_r)
 {
 	struct sieve_instance *svinst = storage->svinst;
-	struct sieve_script *script;
+	struct sieve_script *script = NULL;
+	enum sieve_error error_code;
+	int ret;
+
+	*script_r = NULL;
+	if (error_code_r != NULL)
+		*error_code_r = SIEVE_ERROR_NONE;
+	else
+		error_code_r = &error_code;
+	sieve_storage_clear_error(storage);
 
 	i_assert(storage->v.active_script_open != NULL);
-	script = storage->v.active_script_open(storage);
+	ret = storage->v.active_script_open(storage, &script);
+	i_assert(ret <= 0);
 
-	if (script != NULL ||
+	if (ret == 0 ||
 	    (storage->flags & SIEVE_STORAGE_FLAG_SYNCHRONIZING) != 0 ||
 	    storage->default_location == NULL) {
+		i_assert(script != NULL);
 		if (error_code_r != NULL)
 			*error_code_r = storage->error_code;
-		return script;
+		*script_r = script;
+		return ret;
 	}
 
 	/* Try default script location */
 	if (sieve_script_create_open(svinst, storage->default_location, NULL,
 				     &script, error_code_r) < 0)
-		return NULL;
+		return -1;
 
 	script->storage->is_default = TRUE;
 	script->storage->default_for = storage;
 	sieve_storage_ref(storage);
 
-	return script;
+	*script_r = script;
+	return 0;
 }
 
 int sieve_storage_deactivate(struct sieve_storage *storage, time_t mtime)
diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h
index ed28e5cbcaf84488505f97d40d51358e3a81c52d..29ab19a1c969c4361c9eb892ff9481d2aeed9227 100644
--- a/src/lib-sieve/sieve-storage.h
+++ b/src/lib-sieve/sieve-storage.h
@@ -66,9 +66,9 @@ sieve_storage_get_script_sequence(struct sieve_storage *storage,
 int sieve_storage_active_script_get_name(struct sieve_storage *storage,
 					 const char **name_r);
 
-struct sieve_script *
-sieve_storage_active_script_open(struct sieve_storage *storage,
-				 enum sieve_error *error_code_r);
+int sieve_storage_active_script_open(struct sieve_storage *storage,
+				     struct sieve_script **script_r,
+				     enum sieve_error *error_code_r);
 
 int sieve_storage_active_script_get_last_change(struct sieve_storage *storage,
 						time_t *last_change_r);
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c
index adceb65434408520327928cbf0956ea8b4732095..4c7468764d04166ffc492a10acf9818af6856726 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c
@@ -147,8 +147,9 @@ sieve_dict_storage_get_script(struct sieve_storage *storage, const char *name,
  * Active script
  */
 
-struct sieve_script *
-sieve_dict_storage_active_script_open(struct sieve_storage *storage)
+static int
+sieve_dict_storage_active_script_open(struct sieve_storage *storage,
+				      struct sieve_script **script_r)
 {
 	struct sieve_dict_storage *dstorage =
 		container_of(storage, struct sieve_dict_storage, storage);
@@ -158,10 +159,11 @@ sieve_dict_storage_active_script_open(struct sieve_storage *storage)
 	if (sieve_script_open(&dscript->script, NULL) < 0) {
 		struct sieve_script *script = &dscript->script;
 		sieve_script_unref(&script);
-		return NULL;
+		return -1;
 	}
 
-	return &dscript->script;
+	*script_r = &dscript->script;
+	return 0;
 }
 
 int sieve_dict_storage_active_script_get_name(struct sieve_storage *storage,
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.h b/src/lib-sieve/storage/dict/sieve-dict-storage.h
index 9de04aef5955d829b84d2acb846be62fd0c6bbc1..ef7bfd914970ed2901071e7ea3eee05b63174af9 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.h
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.h
@@ -28,8 +28,6 @@ int sieve_dict_storage_get_dict(struct sieve_dict_storage *dstorage,
 				struct dict **dict_r,
 				enum sieve_error *error_code_r);
 
-struct sieve_script *
-sieve_dict_storage_active_script_open(struct sieve_storage *storage);
 int sieve_dict_storage_active_script_get_name(struct sieve_storage *storage,
 					      const char **name_r);
 
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-active.c b/src/lib-sieve/storage/file/sieve-file-storage-active.c
index d7b2e9a665ea3773188612e13a209b2eb1342474..df2d527610756d2f18f427a3e6f4e28f561aa412 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-active.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-active.c
@@ -233,8 +233,8 @@ int sieve_file_storage_active_script_get_name(struct sieve_storage *storage,
  * Active script
  */
 
-struct sieve_script *
-sieve_file_storage_active_script_open(struct sieve_storage *storage)
+int sieve_file_storage_active_script_open(struct sieve_storage *storage,
+					  struct sieve_script **script_r)
 {
 	struct sieve_file_storage *fstorage =
 		container_of(storage, struct sieve_file_storage, storage);
@@ -242,13 +242,11 @@ sieve_file_storage_active_script_open(struct sieve_storage *storage)
 	const char *scriptfile, *link;
 	int ret;
 
-	sieve_storage_clear_error(storage);
-
 	/* Read the active link */
 	ret = sieve_file_storage_active_read_link(fstorage, &link);
 	if (ret <= 0) {
 		if (ret < 0)
-			return NULL;
+			return -1;
 
 		/* Try to open the active_path as a regular file */
 		if (S_ISDIR(fstorage->st.st_mode)) {
@@ -265,10 +263,11 @@ sieve_file_storage_active_script_open(struct sieve_storage *storage)
 					"Failed to open active path '%s' as regular file: %s",
 					fstorage->active_path, storage->error);
 			}
-			return NULL;
+			return -1;
 		}
 
-		return &fscript->script;
+		*script_r = &fscript->script;
+		return 0;
 	}
 
 	/* Parse the link */
@@ -280,7 +279,7 @@ sieve_file_storage_active_script_open(struct sieve_storage *storage)
 		 */
 		sieve_storage_set_error(storage, SIEVE_ERROR_NOT_FOUND,
 					"Active script is invalid");
-		return NULL;
+		return -1;
 	}
 
 	fscript = sieve_file_script_open_from_path(
@@ -291,7 +290,11 @@ sieve_file_storage_active_script_open(struct sieve_storage *storage)
 			  "Active sieve script symlink %s points to non-existent script "
 			  "(points to %s).", fstorage->active_path, link);
 	}
-	return (fscript != NULL ? &fscript->script : NULL);
+	if (fscript != NULL) {
+		*script_r = &fscript->script;
+		return -1;
+	}
+	return 0;
 }
 
 int sieve_file_storage_active_script_get_last_change(
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index 47785daecd57913c1051ca2ca542ad1a16f6526e..4c01dd7264e69f5620b7145b2890af83139adbd0 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -63,8 +63,8 @@ bool sieve_file_storage_active_rescue_regular(
 
 int sieve_file_storage_active_script_get_name(struct sieve_storage *storage,
 					      const char **name_r);
-struct sieve_script *
-sieve_file_storage_active_script_open(struct sieve_storage *storage);
+int sieve_file_storage_active_script_open(struct sieve_storage *storage,
+					  struct sieve_script **script_r);
 
 int sieve_file_storage_active_script_get_file(
 	struct sieve_file_storage *fstorage, const char **file_r);
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
index ea6a75b43f248558d07fa9f6b1013e75189f0c21..b413c7c7ce5927c2ff2643e5aeecf898db63c1ed 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
@@ -128,8 +128,9 @@ sieve_ldap_storage_get_script(struct sieve_storage *storage, const char *name,
  * Active script
  */
 
-struct sieve_script *
-sieve_ldap_storage_active_script_open(struct sieve_storage *storage)
+static int
+sieve_ldap_storage_active_script_open(struct sieve_storage *storage,
+				      struct sieve_script **script_r)
 {
 	struct sieve_ldap_storage *lstorage =
 		container_of(storage, struct sieve_ldap_storage, storage);
@@ -139,10 +140,11 @@ sieve_ldap_storage_active_script_open(struct sieve_storage *storage)
 	if (sieve_script_open(&lscript->script, NULL) < 0) {
 		struct sieve_script *script = &lscript->script;
 		sieve_script_unref(&script);
-		return NULL;
+		return -1;
 	}
 
-	return &lscript->script;
+	*script_r = &lscript->script;
+	return 0;
 }
 
 int sieve_ldap_storage_active_script_get_name(struct sieve_storage *storage,
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
index 8a9f27c57214885178dbf9356ed0a397d354c87e..01229be104bed8195e988e8bcf2e1bb628a85c57 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
@@ -71,8 +71,6 @@ struct sieve_ldap_storage {
 	struct ldap_connection *conn;
 };
 
-struct sieve_script *
-sieve_ldap_storage_active_script_open(struct sieve_storage *storage);
 int sieve_ldap_storage_active_script_get_name(struct sieve_storage *storage,
 					      const char **name_r);
 
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 90085f664bd0665e910ca92bb6ac80509463625d..879d6f62c4809be5da4565a77fb136eae6b9d9ac 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -497,8 +497,7 @@ sieve_attribute_get_active_script(struct mail_storage *storage,
 		return ret;
 	}
 
-	script = sieve_storage_active_script_open(svstorage, NULL);
-	if (script == NULL)
+	if (sieve_storage_active_script_open(svstorage, &script, NULL) < 0)
 		return 0;
 
 	ret = sieve_attribute_retrieve_script(storage, svstorage, script, TRUE,
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 35926a677279bb0c8cb7e1ee9735ed23ab71bbe9..47ba7d9764648be824251f4f99feedf2682a7914 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -517,15 +517,12 @@ int imap_filter_sieve_open_personal(struct imap_filter_sieve_context *sctx,
 						   error_code_r, error_r) < 0)
 		return -1;
 
-	int ret = 0;
+	int ret;
 
-	if (name == NULL) {
-		script = sieve_storage_active_script_open(storage, NULL);
-		if (script == NULL)
-			ret = -1;
-	} else {
+	if (name == NULL)
+		ret = sieve_storage_active_script_open(storage, &script, NULL);
+	else
 		ret = sieve_storage_open_script(storage, name, &script, NULL);
-	}
 	if (ret < 0) {
 		*error_r = sieve_storage_get_last_error(storage, &error_code);
 
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index e58014c4d3010ccd1bc389a57e8326c0cd1e8dc5..54736a5b82881056312ed4068badb14a44d52980 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -722,10 +722,9 @@ static int lda_sieve_find_scripts(struct lda_sieve_run_context *srctx)
 	if (ret == 0 && error_code == SIEVE_ERROR_NOT_POSSIBLE)
 		return 0;
 	if (ret > 0) {
-		srctx->main_script = sieve_storage_active_script_open(
-			main_storage, &error_code);
-
-		if (srctx->main_script == NULL) {
+		if (sieve_storage_active_script_open(main_storage,
+						     &srctx->main_script,
+						     &error_code) < 0) {
 			switch (error_code) {
 			case SIEVE_ERROR_NOT_FOUND:
 				e_debug(sieve_get_event(svinst),