diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index c428223158cfb0b7214e5090b9260dc3ca642461..0baaa78a7e9c33ff4fa3749cd57bed04ff2f7545 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -208,11 +208,11 @@ extern const struct sieve_storage sieve_data_storage;
 
 extern const struct sieve_storage sieve_file_storage;
 
-struct sieve_storage *
-sieve_file_storage_init_default(struct sieve_instance *svinst,
-				const char *active_path,
-				enum sieve_storage_flags flags,
-				enum sieve_error *error_code_r);
+int sieve_file_storage_init_default(struct sieve_instance *svinst,
+				    const char *active_path,
+				    enum sieve_storage_flags flags,
+				    struct sieve_storage **storage_r,
+				    enum sieve_error *error_code_r);
 
 /* dict */
 
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 4aee4fc38b18162c7b20906710fd161ec1ed7d94..9db3a4ade61890b21edd234ad3ef41e2c5211893 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -443,8 +443,10 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 	}
 
 	if (storage == NULL) {
-		storage = sieve_file_storage_init_default(svinst, set_sieve,
-							  flags, error_code_r);
+		if (sieve_file_storage_init_default(svinst, set_sieve, flags,
+						    &storage, error_code_r) < 0)
+			return NULL;
+		i_assert(storage != NULL);
 	}
 
 	if (storage == NULL)
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index cb4347f1005d88e0cade354348541c093de39888..325f1511c2571ec5c389313cd4caafaaaafefd41 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -697,11 +697,11 @@ sieve_file_storage_do_init_default(struct sieve_file_storage *fstorage,
 	return 0;
 }
 
-struct sieve_storage *
-sieve_file_storage_init_default(struct sieve_instance *svinst,
-				const char *active_path,
-				enum sieve_storage_flags flags,
-				enum sieve_error *error_code_r)
+int sieve_file_storage_init_default(struct sieve_instance *svinst,
+				    const char *active_path,
+				    enum sieve_storage_flags flags,
+				    struct sieve_storage **storage_r,
+				    enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage;
 	struct sieve_file_storage *fstorage;
@@ -713,12 +713,15 @@ sieve_file_storage_init_default(struct sieve_instance *svinst,
 	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
-		if (sieve_file_storage_do_init_default(fstorage, active_path,
-						       error_code_r) < 0)
-			sieve_storage_unref(&storage);
+		ret = sieve_file_storage_do_init_default(fstorage, active_path,
+							 error_code_r);
 	} T_END;
-
-	return storage;
+	if (ret < 0) {
+		sieve_storage_unref(&storage);
+		return -1;
+	}
+	*storage_r = storage;
+	return 0;
 }
 
 int sieve_file_storage_init_from_path(struct sieve_instance *svinst,