diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c
index 296364fb324fbdc0d6bdd811b62f4cda8a42954f..3f3598d844612065c0d81a29b586c3b393dc0d5e 100644
--- a/src/lib-sieve-tool/sieve-tool.c
+++ b/src/lib-sieve-tool/sieve-tool.c
@@ -275,9 +275,8 @@ sieve_tool_init_finish(struct sieve_tool *tool, bool init_mailstore,
 	svenv.delivery_phase = SIEVE_DELIVERY_PHASE_POST;
 
 	/* Initialize Sieve Engine */
-	tool->svinst = sieve_init(&svenv, &sieve_tool_callbacks, tool,
-				  tool->debug);
-	if (tool->svinst == NULL)
+	if (sieve_init(&svenv, &sieve_tool_callbacks, tool, tool->debug,
+		       &tool->svinst) < 0)
 		i_fatal("Failed to initialize Sieve");
 
 	/* Load Sieve plugins */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 4e2b4fd08709b893029218712431ba90a19b81cd..1ee5336bc697b545beafdc3fbdb7e2777fd03d35 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -51,14 +51,16 @@ struct event_category event_category_sieve = {
  * Main Sieve library interface
  */
 
-struct sieve_instance *
-sieve_init(const struct sieve_environment *env,
-	   const struct sieve_callbacks *callbacks, void *context, bool debug)
+int sieve_init(const struct sieve_environment *env,
+	       const struct sieve_callbacks *callbacks, void *context,
+	       bool debug, struct sieve_instance **svinst_r)
 {
 	struct sieve_instance *svinst;
 	const char *domain;
 	pool_t pool;
 
+	*svinst_r = NULL;
+
 	/* Create Sieve engine instance */
 	pool = pool_alloconly_create("sieve", 8192);
 	svinst = p_new(pool, struct sieve_instance, 1);
@@ -117,7 +119,7 @@ sieve_init(const struct sieve_environment *env,
 	/* Initialize extensions */
 	if (!sieve_extensions_init(svinst)) {
 		sieve_deinit(&svinst);
-		return NULL;
+		return -1;
 	}
 
 	/* Initialize storage classes */
@@ -129,7 +131,8 @@ sieve_init(const struct sieve_environment *env,
 	/* Configure extensions */
 	sieve_extensions_configure(svinst);
 
-	return svinst;
+	*svinst_r = svinst;
+	return 0;
 }
 
 void sieve_deinit(struct sieve_instance **_svinst)
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 5f23f230408af42d3ac81e36deff25ab20e9ccf4..2ee15a6ed84993717fd62a723b02d0619d2c326d 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -14,9 +14,9 @@ struct sieve_binary;
 
 /* Initialize the sieve engine. Must be called before any sieve functionality is
    used. */
-struct sieve_instance *
-sieve_init(const struct sieve_environment *env,
-	   const struct sieve_callbacks *callbacks, void *context, bool debug);
+int sieve_init(const struct sieve_environment *env,
+	       const struct sieve_callbacks *callbacks, void *context,
+	       bool debug, struct sieve_instance **svinst_r);
 
 /* Free all memory allocated by the sieve engine. */
 void sieve_deinit(struct sieve_instance **_svinst);
diff --git a/src/managesieve/managesieve-capabilities.c b/src/managesieve/managesieve-capabilities.c
index 34d9fadd7ef159765a9330cbccfcc6a7dbeadc2d..ddac5a4d091967153f3ab49a8c3f0ebfbce80280 100644
--- a/src/managesieve/managesieve-capabilities.c
+++ b/src/managesieve/managesieve-capabilities.c
@@ -77,9 +77,8 @@ void managesieve_capabilities_dump(void)
 	i_zero(&svenv);
 	svenv.home_dir = "/tmp";
 
-	svinst = sieve_init(&svenv, &sieve_callbacks,
-			    (void *) global_plugin_settings, FALSE);
-	if (svinst == NULL)
+	if (sieve_init(&svenv, &sieve_callbacks, (void *)global_plugin_settings,
+		       FALSE, &svinst) < 0)
 		i_fatal("Failed to initialize Sieve");
 
 	/* Dump capabilities */
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index 1ae8e1e6d62d246019337f43c5f9b16be6df96a0..f6627d8acceee04b712786c73ca06e2805d2cdd6 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -125,9 +125,8 @@ int client_create(int fd_in, int fd_out, const char *session_id,
 	svenv.event_parent = event;
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
 
-	svinst = sieve_init(&svenv, &managesieve_sieve_callbacks,
-			    user, set->mail_debug);
-	if (svinst == NULL) {
+	if (sieve_init(&svenv, &managesieve_sieve_callbacks, user,
+		       set->mail_debug, &svinst) < 0) {
 		*error_r = "Failed to initialize Sieve interpreter";
 		return -1;
 	}
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index a5cedb4965a1b9b01913df76e25a9deb30d93f2e..c851e5f28e0c847cbd702f4c5c2a7273ec4b51ba 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -112,9 +112,8 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 	svenv.base_dir = user->set->base_dir;
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
 
-	ctx->svinst = sieve_init(&svenv, &sieve_callbacks, ctx,
-				 user->set->mail_debug);
-	if (ctx->svinst == NULL)
+	if (sieve_init(&svenv, &sieve_callbacks, ctx,
+		       user->set->mail_debug, &ctx->svinst) < 0)
 		return -1;
 
 	ctx->storage = sieve_storage_create_personal(
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 05abee587146e9890570115979bbdad987303dd0..2606e3f271dd680e3e7b1d0bbda2058fe0abad87 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -93,9 +93,8 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r)
 	svenv.base_dir = user->set->base_dir;
 	svenv.flags = SIEVE_FLAG_HOME_RELATIVE;
 
-	suser->svinst = sieve_init(&svenv, &mail_sieve_callbacks,
-				   user, user->set->mail_debug);
-	if (suser->svinst == NULL)
+	if (sieve_init(&svenv, &mail_sieve_callbacks, user,
+		       user->set->mail_debug, &suser->svinst) < 0)
 		return -1;
 
 	suser->sieve_storage =
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index c275d90eb5adb8ae46b40cd6552ef8c0b5267024..95bd45fa21d8edee5f66ed90eee522b94fbe9cd4 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -96,9 +96,8 @@ imap_filter_sieve_get_svinst(struct imap_filter_sieve_context *sctx)
 	svenv.location = SIEVE_ENV_LOCATION_MS;
 	svenv.delivery_phase = SIEVE_DELIVERY_PHASE_POST;
 
-	ifsuser->svinst = sieve_init(&svenv, &imap_filter_sieve_callbacks,
-				     ifsuser, debug);
-	if (ifsuser->svinst == NULL)
+	if (sieve_init(&svenv, &imap_filter_sieve_callbacks, ifsuser, debug,
+		       &ifsuser->svinst) < 0)
 		return NULL;
 
 	ifsuser->master_ehandler =
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 0aaf363c1bf6e8852988d3d2323d4d1c1aab6b7f..88f456b3f792b570e0bd4cef66aae284c64bfb2c 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -88,9 +88,8 @@ struct imap_sieve *imap_sieve_init(struct client *client)
 
 	isieve->home_dir = p_strdup(pool, svenv.home_dir);
 
-	isieve->svinst = sieve_init(&svenv, &mail_sieve_callbacks, isieve,
-				    debug);
-	if (isieve->svinst == NULL)
+	if (sieve_init(&svenv, &mail_sieve_callbacks, isieve,
+		       debug, &isieve->svinst) < 0)
 		return isieve;
 
 	isieve->ext_imapsieve = sieve_extension_replace(
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 66bd0e8590e60110db089afa9c7547644b6df36a..cc5e3c088d290d049404ae5043a900e4dba771e6 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -1069,8 +1069,8 @@ lda_sieve_deliver_mail(struct mail_deliver_context *mdctx,
 	svenv.location = SIEVE_ENV_LOCATION_MDA;
 	svenv.delivery_phase = SIEVE_DELIVERY_PHASE_DURING;
 
-	srctx.svinst = sieve_init(&svenv, &lda_sieve_callbacks, mdctx, debug);
-	if (srctx.svinst == NULL)
+	if (sieve_init(&svenv, &lda_sieve_callbacks, mdctx, debug,
+		       &srctx.svinst) < 0)
 		return -1;
 
 	/* Initialize master error handler */