diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c
index e1fed35c29e8ba181d98874189fd065edca57710..0f4f65875b26502061cdb9e0bb1d934c378dfc16 100644
--- a/src/lib-sieve/sieve-actions.c
+++ b/src/lib-sieve/sieve-actions.c
@@ -37,29 +37,6 @@
 const struct sieve_operand_class sieve_side_effect_operand_class =
 	{ "SIDE-EFFECT" };
 
-bool sieve_opr_side_effect_read
-(const struct sieve_runtime_env *renv, sieve_size_t *address,
-	struct sieve_side_effect *seffect)
-{
-	const struct sieve_side_effect_def *sdef;
-
-	seffect->context = NULL;
-
-	if ( !sieve_opr_object_read
-		(renv, &sieve_side_effect_operand_class, address, &seffect->object) )
-		return FALSE;
-
-	sdef = seffect->def =
-		(const struct sieve_side_effect_def *) seffect->object.def;
-
-	if ( sdef->read_context != NULL &&
-		!sdef->read_context(seffect, renv, address, &seffect->context) ) {
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
 bool sieve_opr_side_effect_dump
 (const struct sieve_dumptime_env *denv, sieve_size_t *address)
 {
@@ -84,6 +61,30 @@ bool sieve_opr_side_effect_dump
 	return TRUE;
 }
 
+int sieve_opr_side_effect_read
+(const struct sieve_runtime_env *renv, sieve_size_t *address,
+	struct sieve_side_effect *seffect)
+{
+	const struct sieve_side_effect_def *sdef;
+	int ret;
+
+	seffect->context = NULL;
+
+	if ( !sieve_opr_object_read
+		(renv, &sieve_side_effect_operand_class, address, &seffect->object) )
+		return SIEVE_EXEC_BIN_CORRUPT;
+
+	sdef = seffect->def =
+		(const struct sieve_side_effect_def *) seffect->object.def;
+
+	if ( sdef->read_context != NULL && (ret=sdef->read_context
+		(seffect, renv, address, &seffect->context)) <= 0 ) {
+		return ret;
+	}
+
+	return SIEVE_EXEC_OK;
+}
+
 /*
  * Optional operands
  */
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index 37d952290c246285ee8b7d27da9e2fdfade75d60..99ae31badb849725b7d62bf18944ecaee2076a88 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -187,12 +187,11 @@ static inline void sieve_opr_side_effect_emit
 	sieve_opr_object_emit(sblock, ext, &seff->obj_def);
 }
 
-bool sieve_opr_side_effect_read
-	(const struct sieve_runtime_env *renv, sieve_size_t *address,
-		struct sieve_side_effect *seffect);
-
 bool sieve_opr_side_effect_dump
 	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+int sieve_opr_side_effect_read
+	(const struct sieve_runtime_env *renv, sieve_size_t *address,
+		struct sieve_side_effect *seffect);
 
 /*
  * Optional operands
diff --git a/src/lib-sieve/sieve-message.c b/src/lib-sieve/sieve-message.c
index 5a0e485b048f1a5f9dd900d25a1b85feb6fe24cc..20bd783e2b84447458dafd3a92e8d12d01349403 100644
--- a/src/lib-sieve/sieve-message.c
+++ b/src/lib-sieve/sieve-message.c
@@ -604,27 +604,27 @@ bool sieve_opr_message_override_dump
 	return TRUE;
 }
 
-bool sieve_opr_message_override_read
+int sieve_opr_message_override_read
 (const struct sieve_runtime_env *renv, sieve_size_t *address,
 	struct sieve_message_override *svmo)
 {
 	const struct sieve_message_override_def *hodef;
+	int ret;
 
 	svmo->context = NULL;
 
 	if ( !sieve_opr_object_read
 		(renv, &sieve_message_override_operand_class, address, &svmo->object) )
-		return FALSE;
+		return SIEVE_EXEC_BIN_CORRUPT;
 
 	hodef = svmo->def =
 		(const struct sieve_message_override_def *) svmo->object.def;
 
 	if ( hodef->read_context != NULL &&
-		!hodef->read_context(svmo, renv, address, &svmo->context) ) {
-		return FALSE;
-	}
+		(ret=hodef->read_context(svmo, renv, address, &svmo->context)) <= 0 )
+		return ret;
 
-	return TRUE;
+	return SIEVE_EXEC_OK;
 }
 
 /*
diff --git a/src/lib-sieve/sieve-message.h b/src/lib-sieve/sieve-message.h
index f6d16428fce140f7365cacc37dae88909c2140b3..4b23a2761dd870828968027b2bc7b8209576d7cc 100644
--- a/src/lib-sieve/sieve-message.h
+++ b/src/lib-sieve/sieve-message.h
@@ -135,12 +135,11 @@ static inline void sieve_opr_message_override_emit
 	sieve_opr_object_emit(sblock, ext, &seff->obj_def);
 }
 
-bool sieve_opr_message_override_read
-	(const struct sieve_runtime_env *renv, sieve_size_t *address,
-		struct sieve_message_override *svmo);
-
 bool sieve_opr_message_override_dump
 	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+int sieve_opr_message_override_read
+	(const struct sieve_runtime_env *renv, sieve_size_t *address,
+		struct sieve_message_override *svmo);
 
 /*
  * Optional operands