diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index b84ba348123c59701701ace2b7079feca6168c89..8b609f51d7a2f0621f25029eb0967dc8fee80fdb 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -121,7 +121,8 @@ struct sieve_storage {
 int sieve_storage_alloc(struct sieve_instance *svinst, struct event *event,
 			const struct sieve_storage *storage_class,
 			const char *data, enum sieve_storage_flags flags,
-			bool main, struct sieve_storage **storage_r);
+			bool main, struct sieve_storage **storage_r,
+			enum sieve_error *error_code_r);
 
 int sieve_storage_setup_bin_path(struct sieve_storage *storage, mode_t mode);
 
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 3558ae51ef2c7c1155a73bb125783c3463e2ba76..0437f47d439f1fdd826fbea593ab528de7fc3eff 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -320,12 +320,14 @@ sieve_storage_alloc_from_class(struct sieve_instance *svinst,
 int sieve_storage_alloc(struct sieve_instance *svinst, struct event *event,
 			const struct sieve_storage *storage_class,
 			const char *data, enum sieve_storage_flags flags,
-			bool main, struct sieve_storage **storage_r)
+			bool main, struct sieve_storage **storage_r,
+			enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage;
 	int ret;
 
 	*storage_r = NULL;
+	sieve_error_args_init(&error_code_r, NULL);
 
 	if (event != NULL)
 		event_ref(event);
@@ -381,9 +383,10 @@ sieve_storage_init_real(struct sieve_instance *svinst, struct event *event,
 	driver_event = sieve_storage_create_driver_event(
 		event, storage_class->driver_name);
 	ret = sieve_storage_alloc(svinst, driver_event, storage_class,
-				  data, flags, main, &storage);
+				  data, flags, main, &storage, error_code_r);
 	event_unref(&driver_event);
-	i_assert(ret == 0);
+	if (ret < 0)
+		return -1;
 	i_assert(storage != NULL);
 	i_assert(storage_class->v.init != NULL);
 
diff --git a/src/lib-sieve/storage/data/sieve-data-script.c b/src/lib-sieve/storage/data/sieve-data-script.c
index 1162b38f10c56ff0f7e7f005a391634f9e5d67c9..45065a2d241fd92e1e9a1134bbc72ebac33341e1 100644
--- a/src/lib-sieve/storage/data/sieve-data-script.c
+++ b/src/lib-sieve/storage/data/sieve-data-script.c
@@ -39,8 +39,8 @@ sieve_data_script_create_from_input(struct sieve_instance *svinst,
 	int ret;
 
 	ret = sieve_storage_alloc(svinst, NULL, &sieve_data_storage,
-				  "", 0, FALSE, &storage);
-	i_assert(ret == 0);
+				  "", 0, FALSE, &storage, NULL);
+	i_assert(ret >= 0);
 
 	dscript = sieve_data_script_alloc();
 	sieve_script_init(&dscript->script, storage, &sieve_data_script,
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index bb04272a4d8cb571d4c6499eb103d1ea22e8ec5b..95a3d4377f030a7af3fc3bbc1e59d7dbd141d6af 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -695,8 +695,9 @@ int sieve_file_storage_init_default(struct sieve_instance *svinst,
 	int ret;
 
 	ret = sieve_storage_alloc(svinst, NULL, &sieve_file_storage,
-				  "", flags, TRUE, &storage);
-	i_assert(ret == 0);
+				  "", flags, TRUE, &storage, error_code_r);
+	if (ret < 0)
+		return -1;
 	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
@@ -727,8 +728,9 @@ int sieve_file_storage_init_from_path(struct sieve_instance *svinst,
 	sieve_error_args_init(&error_code_r, NULL);
 
 	ret = sieve_storage_alloc(svinst, NULL, &sieve_file_storage,
-				  "", flags, FALSE, &storage);
-	i_assert(ret == 0);
+				  "", flags, FALSE, &storage, error_code_r);
+	if (ret < 0)
+		return -1;
 	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {