diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c
index 341b7f8b2c2250f72d7fe41ad1c5481fcb607d8b..3fadcc599f289d10ecd74c766369aaee60989621 100644
--- a/src/lib-sieve/storage/file/sieve-file-script.c
+++ b/src/lib-sieve/storage/file/sieve-file-script.c
@@ -239,38 +239,29 @@ int sieve_file_script_init_from_path(struct sieve_file_storage *fstorage,
 	return 0;
 }
 
-struct sieve_file_script *
-sieve_file_script_open_from_path(struct sieve_file_storage *fstorage,
-				 const char *path, const char *scriptname,
-				 enum sieve_error *error_code_r)
+int sieve_file_script_open_from_path(struct sieve_file_storage *fstorage,
+				     const char *path, const char *scriptname,
+				     struct sieve_file_script **fscript_r)
 {
 	struct sieve_storage *storage = &fstorage->storage;
 	struct sieve_file_script *fscript;
-	enum sieve_error error_code;
 
-	if (error_code_r != NULL)
-		*error_code_r = SIEVE_ERROR_NONE;
-	else
-		error_code_r = &error_code;
+	*fscript_r = NULL;
 
 	if (sieve_file_script_init_from_path(fstorage, path, scriptname,
-					     &fscript) < 0) {
-		*error_code_r = storage->error_code;
-		return NULL;
-	}
+					     &fscript) < 0)
+		return -1;
 
-	if (sieve_script_open(&fscript->script, error_code_r) < 0) {
+	if (sieve_script_open(&fscript->script, NULL) < 0) {
 		struct sieve_script *script = &fscript->script;
-		const char *errormsg;
 
-		errormsg = sieve_script_get_last_error(
-			&fscript->script, error_code_r);
-		sieve_storage_set_error(storage, *error_code_r, "%s", errormsg);
+		sieve_storage_copy_error(storage, script->storage);
 		sieve_script_unref(&script);
-		return NULL;
+		return -1;
 	}
 
-	return fscript;
+	*fscript_r = fscript;
+	return 0;
 }
 
 /*
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 028a2d079d16cd0a362120a53f096f3a4e5b55ca..bcc7456e1260ea82aa69847f415b3821adca36df 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-active.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-active.c
@@ -242,6 +242,8 @@ int sieve_file_storage_active_script_open(struct sieve_storage *storage,
 	const char *scriptfile, *link;
 	int ret;
 
+	*script_r = NULL;
+
 	/* Read the active link */
 	ret = sieve_file_storage_active_read_link(fstorage, &link);
 	if (ret <= 0) {
@@ -250,14 +252,14 @@ int sieve_file_storage_active_script_open(struct sieve_storage *storage,
 
 		/* Try to open the active_path as a regular file */
 		if (S_ISDIR(fstorage->st.st_mode)) {
-			fscript = sieve_file_script_open_from_path(
-				fstorage, fstorage->active_path, NULL, NULL);
+			ret = sieve_file_script_open_from_path(
+				fstorage, fstorage->active_path, NULL,
+				&fscript);
 		} else {
-			if (sieve_file_script_open_from_name(
-				fstorage, NULL, &fscript) < 0)
-				fscript = NULL;
+			ret = sieve_file_script_open_from_name(fstorage, NULL,
+							       &fscript);
 		}
-		if (fscript == NULL) {
+		if (ret < 0) {
 			if (storage->error_code != SIEVE_ERROR_NOT_FOUND) {
 				sieve_storage_set_critical(
 					storage,
@@ -283,18 +285,17 @@ int sieve_file_storage_active_script_open(struct sieve_storage *storage,
 		return -1;
 	}
 
-	fscript = sieve_file_script_open_from_path(
+	ret = sieve_file_script_open_from_path(
 		fstorage, fstorage->active_path,
-		sieve_script_file_get_scriptname(scriptfile), NULL);
-	if (fscript == NULL && storage->error_code == SIEVE_ERROR_NOT_FOUND) {
+		sieve_script_file_get_scriptname(scriptfile), &fscript);
+	if (ret < 0 && storage->error_code == SIEVE_ERROR_NOT_FOUND) {
 		e_warning(storage->event,
 			  "Active sieve script symlink %s points to non-existent script "
 			  "(points to %s).", fstorage->active_path, link);
 	}
-	if (fscript != NULL) {
-		*script_r = &fscript->script;
+	if (ret < 0)
 		return -1;
-	}
+	*script_r = &fscript->script;
 	return 0;
 }
 
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-save.c b/src/lib-sieve/storage/file/sieve-file-storage-save.c
index d4468b4d81f9e51a03d3c88d6e099ce4253f1f72..a96afda9b880f5d1695f14f5a9bdb2787c6e6dae 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-save.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-save.c
@@ -347,10 +347,10 @@ sieve_file_storage_save_get_tempscript(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
 		container_of(sctx, struct sieve_file_save_context, context);
+	struct sieve_storage *storage = sctx->storage;
 	struct sieve_file_storage *fstorage =
-		container_of(sctx->storage, struct sieve_file_storage, storage);
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_script *tmpscript;
-	enum sieve_error error_code;
 	const char *scriptname;
 
 	if (sctx->failed)
@@ -360,20 +360,19 @@ sieve_file_storage_save_get_tempscript(struct sieve_storage_save_context *sctx)
 		return sctx->scriptobject;
 
 	scriptname = (sctx->scriptname == NULL ? "" : sctx->scriptname);
-	tmpscript = sieve_file_script_open_from_path(fstorage, fsctx->tmp_path,
-						     scriptname, &error_code);
-
-	if (tmpscript == NULL) {
-		if (error_code == SIEVE_ERROR_NOT_FOUND) {
+	if (sieve_file_script_open_from_path(fstorage,
+					     fsctx->tmp_path, scriptname,
+					     &tmpscript) < 0) {
+		if (storage->error_code == SIEVE_ERROR_NOT_FOUND) {
 			sieve_storage_set_critical(
-				sctx->storage, "save: "
+				storage, "save: "
 				"Temporary script file '%s' got lost, "
 				"which should not happen "
 				"(possibly deleted externally).",
 				fsctx->tmp_path);
 		} else {
 			sieve_storage_set_critical(
-				sctx->storage, "save: "
+				storage, "save: "
 				"Failed to open temporary script file '%s'",
 				fsctx->tmp_path);
 		}
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index 4efcce4f9a2ef469c981ef8c1f35478d806a003c..6a9a7e929529fa465e1e5cfc79cb27240a921155 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -155,10 +155,9 @@ int sieve_file_script_open_from_name(struct sieve_file_storage *fstorage,
 int sieve_file_script_init_from_path(struct sieve_file_storage *fstorage,
 				     const char *path, const char *scriptname,
 				     struct sieve_file_script **fscript_r);
-struct sieve_file_script *
-sieve_file_script_open_from_path(struct sieve_file_storage *fstorage,
-				 const char *path, const char *scriptname,
-				 enum sieve_error *error_code_r);
+int sieve_file_script_open_from_path(struct sieve_file_storage *fstorage,
+				     const char *path, const char *scriptname,
+				     struct sieve_file_script **fscript_r);
 
 /* Return directory where script resides in. Returns NULL if this is not a file
    script.