diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 4f07c097da9402c3129a5b91764fde2ee0e75f4e..895f933764fe6ca572cbebdaaf81860f879988bb 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");