From 79d6a5b80d56edbe54c0473eaa872e4e882da32e Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 13 Nov 2014 09:36:13 +0100 Subject: [PATCH] lib-sieve: Fixed bug in handling of binary errors for action side-effects and message overrides. --- src/lib-sieve/sieve-actions.c | 47 ++++++++++++++++++----------------- src/lib-sieve/sieve-actions.h | 7 +++--- src/lib-sieve/sieve-message.c | 12 ++++----- src/lib-sieve/sieve-message.h | 7 +++--- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c index e1fed35c2..0f4f65875 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 37d952290..99ae31bad 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 5a0e485b0..20bd783e2 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 f6d16428f..4b23a2761 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 -- GitLab