diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index 7aee135a8ef19b6e5e36190aef9c7aa0d9be9541..fbe45cf57bbfe34924d364ab3e467dd430d06d58 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -485,9 +485,9 @@ int sieve_extension_reload(const struct sieve_extension *ext)
 	return _sieve_extension_load(*mod_ext);
 }
 
-const struct sieve_extension *
-sieve_extension_replace(struct sieve_instance *svinst,
-			const struct sieve_extension_def *extdef, bool load)
+int sieve_extension_replace(struct sieve_instance *svinst,
+			    const struct sieve_extension_def *extdef, bool load,
+			    const struct sieve_extension **ext_r)
 {
 	struct sieve_extension *ext;
 
@@ -495,11 +495,7 @@ sieve_extension_replace(struct sieve_instance *svinst,
 	if (ext != NULL)
 		sieve_extension_unregister(ext);
 
-	const struct sieve_extension *ext_new;
-
-	if (sieve_extension_register(svinst, extdef, load, &ext_new) < 0)
-		return NULL;
-	return ext_new;
+	return sieve_extension_register(svinst, extdef, load, ext_r);
 }
 
 void sieve_extension_override(struct sieve_instance *svinst, const char *name,
diff --git a/src/lib-sieve/sieve-extensions.h b/src/lib-sieve/sieve-extensions.h
index c63d3f87eb354b0070fd38195616b2f59f73d5e1..21cdb473bb4bf0c8113d76d5ef68d04acdfec3d3 100644
--- a/src/lib-sieve/sieve-extensions.h
+++ b/src/lib-sieve/sieve-extensions.h
@@ -137,9 +137,9 @@ int sieve_extension_reload(const struct sieve_extension *ext);
 
 void sieve_extension_unregister(const struct sieve_extension *ext);
 
-const struct sieve_extension *
-sieve_extension_replace(struct sieve_instance *svinst,
-			const struct sieve_extension_def *extdef, bool load);
+int sieve_extension_replace(struct sieve_instance *svinst,
+			    const struct sieve_extension_def *extdef, bool load,
+			    const struct sieve_extension **ext_r);
 void sieve_extension_override(struct sieve_instance *svinst, const char *name,
 			      const struct sieve_extension *ext);
 
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 54631d7012d4c680a0e9113775e26e48f74f5e70..8bb20c33cafe120cda24e601f7f4272e5c5b50e3 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -92,10 +92,13 @@ struct imap_sieve *imap_sieve_init(struct client *client)
 		       debug, &isieve->svinst) < 0)
 		return isieve;
 
-	isieve->ext_imapsieve = sieve_extension_replace(
-		isieve->svinst, &imapsieve_extension, TRUE);
-	isieve->ext_vnd_imapsieve = sieve_extension_replace(
-		isieve->svinst, &vnd_imapsieve_extension, TRUE);
+	if (sieve_extension_replace(isieve->svinst, &imapsieve_extension,
+				    TRUE, &isieve->ext_imapsieve) < 0 ||
+	    sieve_extension_replace(isieve->svinst, &vnd_imapsieve_extension,
+				    TRUE, &isieve->ext_vnd_imapsieve) < 0) {
+		sieve_deinit(&isieve->svinst);
+		return isieve;
+	}
 
 	isieve->master_ehandler =
 		sieve_master_ehandler_create(isieve->svinst, 0);