diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c
index 3fadcc599f289d10ecd74c766369aaee60989621..f9868f34ed5842e8330eb1e0394b00025030541b 100644
--- a/src/lib-sieve/storage/file/sieve-file-script.c
+++ b/src/lib-sieve/storage/file/sieve-file-script.c
@@ -221,9 +221,8 @@ int sieve_file_script_init_from_path(struct sieve_file_storage *fstorage,
 
 	*fscript_r = NULL;
 
-	fsubstorage = sieve_file_storage_init_from_path(svinst, path, 0,
-							&error_code);
-	if (fsubstorage == NULL) {
+	if (sieve_file_storage_init_from_path(svinst, path, 0, &fsubstorage,
+					      &error_code) < 0) {
 		sieve_storage_set_error(storage, error_code,
 					"Failed to open script");
 		return -1;
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index 35bdaa63b753f9bcd9f98317b5493abfac41e9a6..cb4347f1005d88e0cade354348541c093de39888 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -721,32 +721,40 @@ sieve_file_storage_init_default(struct sieve_instance *svinst,
 	return storage;
 }
 
-struct sieve_file_storage *
-sieve_file_storage_init_from_path(struct sieve_instance *svinst,
-				  const char *path,
-				  enum sieve_storage_flags flags,
-				  enum sieve_error *error_code_r)
+int sieve_file_storage_init_from_path(struct sieve_instance *svinst,
+				      const char *path,
+				      enum sieve_storage_flags flags,
+				      struct sieve_file_storage **fstorage_r,
+				      enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage;
 	struct sieve_file_storage *fstorage;
+	enum sieve_error error_code;
 	int ret;
 
 	i_assert(path != NULL);
 
+	*fstorage_r = NULL;
+	if (error_code_r != NULL)
+		*error_code_r = SIEVE_ERROR_NONE;
+	else
+		error_code_r = &error_code;
+
 	ret = sieve_storage_alloc(svinst, NULL, &sieve_file_storage,
 				  "", flags, FALSE, &storage);
 	i_assert(ret == 0);
 	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
-		if (sieve_file_storage_init_common(fstorage, path, NULL, FALSE,
-						   error_code_r) < 0) {
-			sieve_storage_unref(&storage);
-			fstorage = NULL;
-		}
+		ret = sieve_file_storage_init_common(fstorage, path, NULL,
+						     FALSE, error_code_r);
 	} T_END;
-
-	return fstorage;
+	if (ret < 0) {
+		sieve_storage_unref(&storage);
+		return -1;
+	}
+	*fstorage_r = fstorage;
+	return 0;
 }
 
 static int sieve_file_storage_is_singular(struct sieve_storage *storage)
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index 6a9a7e929529fa465e1e5cfc79cb27240a921155..2f1a995fe4ad1ed5574ae5bcb1a8c0ba0c01c6ba 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -46,11 +46,11 @@ const char *
 sieve_file_storage_path_extend(struct sieve_file_storage *fstorage,
 			       const char *filename);
 
-struct sieve_file_storage *
-sieve_file_storage_init_from_path(struct sieve_instance *svinst,
-				  const char *path,
-				  enum sieve_storage_flags flags,
-				  enum sieve_error *error_code_r);
+int sieve_file_storage_init_from_path(struct sieve_instance *svinst,
+				      const char *path,
+				      enum sieve_storage_flags flags,
+				      struct sieve_file_storage **fstorage_r,
+				      enum sieve_error *error_code_r);
 
 int sieve_file_storage_pre_modify(struct sieve_storage *storage);