From 3e0a599e6df896392a839704dcaffa5f32dd25d8 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Mon, 8 Jun 2020 19:26:35 +0200 Subject: [PATCH] lib-sieve: sieve-interpreter - Split off sieve_interpreter_check_program_jump(). --- src/lib-sieve/sieve-interpreter.c | 41 ++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 4f07c097d..895f93376 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -762,13 +762,34 @@ sieve_size_t sieve_interpreter_program_counter(struct sieve_interpreter *interp) return interp->runenv.pc; } +static int +sieve_interpreter_check_program_jump(struct sieve_interpreter *interp, + sieve_size_t jmp_target, bool break_loops) +{ + const struct sieve_runtime_env *renv = &interp->runenv; + sieve_size_t loop_limit = (break_loops ? 0 : interp->loop_limit); + + if (jmp_target == 0 || + jmp_target > sieve_binary_block_get_size(renv->sblock) || + (loop_limit > 0 && jmp_target >= loop_limit)) { + if (interp->loop_limit != 0) { + sieve_runtime_trace_error( + renv, "jump target crosses loop boundary"); + } else { + sieve_runtime_trace_error( + renv, "jump target out of range"); + } + return SIEVE_EXEC_BIN_CORRUPT; + } + return SIEVE_EXEC_OK; +} + int sieve_interpreter_program_jump(struct sieve_interpreter *interp, bool jump, bool break_loops) { const struct sieve_runtime_env *renv = &interp->runenv; sieve_size_t *address = &(interp->runenv.pc); sieve_size_t jmp_start = *address, jmp_target; - sieve_size_t loop_limit = (break_loops ? 0 : interp->loop_limit); sieve_offset_t jmp_offset; int ret; @@ -777,20 +798,12 @@ int sieve_interpreter_program_jump(struct sieve_interpreter *interp, sieve_runtime_trace_error(renv, "invalid jump offset"); return SIEVE_EXEC_BIN_CORRUPT; } - jmp_target = jmp_start + jmp_offset; - if (jmp_target == 0 || - jmp_target > sieve_binary_block_get_size(renv->sblock) || - (loop_limit > 0 && jmp_target >= loop_limit)) { - if (interp->loop_limit != 0) { - sieve_runtime_trace_error( - renv, "jump offset crosses loop boundary"); - } else { - sieve_runtime_trace_error( - renv, "jump offset out of range"); - } - return SIEVE_EXEC_BIN_CORRUPT; - } + + ret = sieve_interpreter_check_program_jump(interp, jmp_target, + break_loops); + if (ret <= 0) + return ret; if (!jump) { sieve_runtime_trace(renv, 0, "not jumping"); -- GitLab