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