diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 2a9e32411b8d4627ae8d454e32ed8ae152b1b1dc..b71a1af2d685fc702fb125c0d3364bd83cbaee5e 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -295,10 +295,11 @@ sieve_storage_alloc(struct sieve_instance *svinst, struct event *event,
 	return storage;
 }
 
-static struct sieve_storage *
+static int
 sieve_storage_init(struct sieve_instance *svinst,
 		   const struct sieve_storage *storage_class, const char *data,
 		   enum sieve_storage_flags flags, bool main,
+		   struct sieve_storage **storage_r,
 		   enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage;
@@ -306,7 +307,9 @@ sieve_storage_init(struct sieve_instance *svinst,
 	const char *location;
 	struct event *event;
 	enum sieve_error error_code;
+	int ret;
 
+	*storage_r = NULL;
 	if (error_code_r != NULL)
 		*error_code_r = SIEVE_ERROR_NONE;
 	else
@@ -321,7 +324,7 @@ sieve_storage_init(struct sieve_instance *svinst,
 		e_debug(event, "Storage does not support synchronization");
 		*error_code_r = SIEVE_ERROR_NOT_POSSIBLE;
 		event_unref(&event);
-		return NULL;
+		return -1;
 	}
 
 	if ((flags & SIEVE_STORAGE_FLAG_READWRITE) != 0 &&
@@ -329,31 +332,35 @@ sieve_storage_init(struct sieve_instance *svinst,
 		e_error(event, "Storage does not support write access");
 		*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
 		event_unref(&event);
-		return NULL;
+		return -1;
 	}
 
 	T_BEGIN {
 		storage = sieve_storage_alloc(svinst, event, storage_class,
 					      data, flags, main);
 
-		if (sieve_storage_data_parse(storage, data,
-					     &location, &options) < 0) {
+		ret = sieve_storage_data_parse(storage, data,
+					       &location, &options);
+		if (ret < 0)
 			*error_code_r = SIEVE_ERROR_TEMP_FAILURE;
-			sieve_storage_unref(&storage);
-		} else {
+		else {
 			storage->location = p_strdup(storage->pool, location);
 
 			event_add_str(event, "script_location",
 				      storage->location);
 
-			if (storage_class->v.init(storage, options,
-						  error_code_r) < 0)
-				sieve_storage_unref(&storage);
+			ret = storage_class->v.init(storage, options,
+						    error_code_r);
+			i_assert(ret <= 0);
 		}
 	} T_END;
-
 	event_unref(&event);
-	return storage;
+	if (ret < 0) {
+		sieve_storage_unref(&storage);
+		return -1;
+	}
+	*storage_r = storage;
+	return 0;
 }
 
 struct sieve_storage *
@@ -384,8 +391,12 @@ sieve_storage_create(struct sieve_instance *svinst, const char *location,
 	if (ret == 0)
 		storage_class = &sieve_file_storage;
 
-	return sieve_storage_init(svinst, storage_class, data, flags,
-				  FALSE, error_code_r);
+	struct sieve_storage *storage;
+
+	if (sieve_storage_init(svinst, storage_class, data, flags, FALSE,
+			       &storage, error_code_r) < 0)
+		return NULL;
+	return storage;
 }
 
 static struct sieve_storage *
@@ -423,9 +434,9 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 
 		if (ret > 0) {
 			/* The normal case: explicit driver name */
-			storage = sieve_storage_init(svinst, sieve_class, data,
-						     flags, TRUE, error_code_r);
-			if (storage == NULL)
+			if (sieve_storage_init(svinst, sieve_class, data,
+					       flags, TRUE,
+					       &storage, error_code_r) < 0)
 				return NULL;
 		}