diff --git a/src/lib-sieve/plugins/environment/sieve-ext-environment.h b/src/lib-sieve/plugins/environment/sieve-ext-environment.h
index 7ae76db3d6c89a83db8dd0df47fa3bc0fd22a10a..34b5e2edd2110a0de1c2fe10c03adfaadf6d405c 100644
--- a/src/lib-sieve/plugins/environment/sieve-ext-environment.h
+++ b/src/lib-sieve/plugins/environment/sieve-ext-environment.h
@@ -25,7 +25,12 @@ sieve_ext_environment_get_extension(struct sieve_instance *svinst)
 static inline const struct sieve_extension *
 sieve_ext_environment_require_extension(struct sieve_instance *svinst)
 {
-	return sieve_extension_require(svinst, &environment_extension, TRUE);
+	const struct sieve_extension *ext;
+
+	if (sieve_extension_require(svinst, &environment_extension, TRUE,
+				    &ext) < 0)
+		return NULL;
+	return ext;
 }
 
 bool sieve_ext_environment_is_active(const struct sieve_extension *env_ext,
diff --git a/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h
index 7c3078a73a4895bc883add6a17f28598a6c6cb90..fdac9bac56105055f3d9d9d8b900af1cded57717 100644
--- a/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h
+++ b/src/lib-sieve/plugins/imap4flags/sieve-ext-imap4flags.h
@@ -16,7 +16,12 @@ extern const struct sieve_interpreter_extension
 static inline const struct sieve_extension *
 sieve_ext_imap4flags_require_extension(struct sieve_instance *svinst)
 {
-	return sieve_extension_require(svinst, &imap4flags_extension, TRUE);
+	const struct sieve_extension *ext;
+
+	if (sieve_extension_require(svinst, &imap4flags_extension, TRUE,
+				    &ext) < 0)
+		return NULL;
+	return ext;
 }
 
 void sieve_ext_imap4flags_interpreter_load(
diff --git a/src/lib-sieve/plugins/vacation/ext-vacation-seconds.c b/src/lib-sieve/plugins/vacation/ext-vacation-seconds.c
index 7775f3a6ac24971089e3f8176eb7320164537423..1d52fc44f0b3f63512625b587e22db799ab0e75d 100644
--- a/src/lib-sieve/plugins/vacation/ext-vacation-seconds.c
+++ b/src/lib-sieve/plugins/vacation/ext-vacation-seconds.c
@@ -46,6 +46,7 @@ const struct sieve_extension_def vacation_seconds_extension = {
 static bool
 ext_vacation_seconds_load(const struct sieve_extension *ext, void **context)
 {
+	const struct sieve_extension *ext_vac;
 	struct ext_vacation_seconds_context *extctx;
 
 	if (*context != NULL) {
@@ -53,11 +54,13 @@ ext_vacation_seconds_load(const struct sieve_extension *ext, void **context)
 		*context = NULL;
 	}
 
-	extctx = i_new(struct ext_vacation_seconds_context, 1);
-
 	/* Make sure vacation extension is registered */
-	extctx->ext_vacation = sieve_extension_require(
-		ext->svinst, &vacation_extension, TRUE);
+	if (sieve_extension_require(ext->svinst, &vacation_extension,
+				    TRUE, &ext_vac) < 0)
+		return FALSE;
+
+	extctx = i_new(struct ext_vacation_seconds_context, 1);
+	extctx->ext_vacation = ext_vac;
 
 	*context = extctx;
 	return TRUE;
diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index c1d553b09375a6f824f43a2798a7f2fcb7c4f856..58518f4f9238399ccdd16caa5a811387fcad6422 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -463,16 +463,12 @@ void sieve_extension_unregister(const struct sieve_extension *ext)
 	}
 }
 
-const struct sieve_extension *
-sieve_extension_require(struct sieve_instance *svinst,
-			const struct sieve_extension_def *extdef, bool load)
+int sieve_extension_require(struct sieve_instance *svinst,
+			    const struct sieve_extension_def *extdef, bool load,
+			    const struct sieve_extension **ext_r)
 {
-	const struct sieve_extension *ext;
-
-	if (_sieve_extension_register_const(svinst, extdef, load, TRUE,
-					    &ext) < 0)
-		return NULL;
-	return ext;
+	return _sieve_extension_register_const(svinst, extdef, load, TRUE,
+					       ext_r);
 }
 
 bool sieve_extension_reload(const struct sieve_extension *ext)
diff --git a/src/lib-sieve/sieve-extensions.h b/src/lib-sieve/sieve-extensions.h
index 3d655ea76d38e11743135fbab9b800c3f25fd9cd..7546b63523a22d4089f51d5271633fa760e2c557 100644
--- a/src/lib-sieve/sieve-extensions.h
+++ b/src/lib-sieve/sieve-extensions.h
@@ -130,9 +130,9 @@ sieve_extensions_get_preloaded(struct sieve_instance *svinst,
 int sieve_extension_register(struct sieve_instance *svinst,
 			     const struct sieve_extension_def *extdef,
 			     bool load, const struct sieve_extension **ext_r);
-const struct sieve_extension *
-sieve_extension_require(struct sieve_instance *svinst,
-			const struct sieve_extension_def *extension, bool load);
+int sieve_extension_require(struct sieve_instance *svinst,
+			    const struct sieve_extension_def *extdef, bool load,
+			    const struct sieve_extension **ext_r);
 bool sieve_extension_reload(const struct sieve_extension *ext);
 
 void sieve_extension_unregister(const struct sieve_extension *ext);
diff --git a/src/plugins/imapsieve/ext-imapsieve.c b/src/plugins/imapsieve/ext-imapsieve.c
index ff56b5ef24f1746bdfbd6ffdd24d34370bbf99b7..077e7b77498566ca3bc774b011b11945a344db05 100644
--- a/src/plugins/imapsieve/ext-imapsieve.c
+++ b/src/plugins/imapsieve/ext-imapsieve.c
@@ -100,11 +100,13 @@ ext_vnd_imapsieve_load(const struct sieve_extension *ext, void **context)
 
 	extctx = i_new(struct ext_vnd_imapsieve_context, 1);
 #ifdef __IMAPSIEVE_DUMMY
-	extctx->ext_imapsieve = sieve_extension_require(
-		ext->svinst, &imapsieve_extension_dummy, TRUE);
+	if (sieve_extension_require(ext->svinst, &imapsieve_extension_dummy,
+				    TRUE, &extctx->ext_imapsieve) < 0)
+		return FALSE;
 #else
-	extctx->ext_imapsieve = sieve_extension_require(
-		ext->svinst, &imapsieve_extension, TRUE);
+	if (sieve_extension_require(ext->svinst, &imapsieve_extension,
+				    TRUE, &extctx->ext_imapsieve) < 0)
+		return FALSE;
 #endif
 
 	*context = extctx;