diff --git a/src/lib-sieve/cmd-discard.c b/src/lib-sieve/cmd-discard.c index f62fd0f4ea074e8e80d2b4ea3b93b84a1776467a..c85b86dda4126210a700467acb4fa5b459600b37 100644 --- a/src/lib-sieve/cmd-discard.c +++ b/src/lib-sieve/cmd-discard.c @@ -77,13 +77,10 @@ const struct sieve_action_def act_discard = { */ static bool cmd_discard_generate -(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) +(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd ATTR_UNUSED) { sieve_operation_emit(cgenv->sblock, NULL, &cmd_discard_operation); - /* Emit line number */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - return TRUE; } @@ -97,10 +94,6 @@ static bool cmd_discard_operation_dump sieve_code_dumpf(denv, "DISCARD"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - return sieve_code_dumper_print_optional_operands(denv, address); } @@ -115,10 +108,7 @@ static int cmd_discard_operation_execute unsigned int source_line; /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "failed to read source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); sieve_runtime_trace(renv, "DISCARD action"); diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c index c228a29433ebfec983e371b843225dace86fe4e6..eff2f09039b6882e3b078558ebdc1486d7387237 100644 --- a/src/lib-sieve/cmd-keep.c +++ b/src/lib-sieve/cmd-keep.c @@ -59,9 +59,6 @@ static bool cmd_keep_generate /* Emit opcode */ sieve_operation_emit(cgenv->sblock, NULL, &cmd_keep_operation); - /* Emit line number */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -76,10 +73,6 @@ static bool cmd_keep_operation_dump sieve_code_dumpf(denv, "KEEP"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - return sieve_code_dumper_print_optional_operands(denv, address); } @@ -88,18 +81,14 @@ static bool cmd_keep_operation_dump */ static int cmd_keep_operation_execute -(const struct sieve_runtime_env *renv ATTR_UNUSED, - sieve_size_t *address ATTR_UNUSED) +(const struct sieve_runtime_env *renv, sieve_size_t *address) { struct sieve_side_effects_list *slist = NULL; unsigned int source_line; int ret = 0; /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands (side effects only) */ if ( (ret=sieve_interpreter_handle_optional_operands diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c index 0be56bffe33c94d3f813e80c0c6192bef0894cd7..13d0c8d85cc4dd8c8401e8c742c113267bff2759 100644 --- a/src/lib-sieve/cmd-redirect.c +++ b/src/lib-sieve/cmd-redirect.c @@ -162,9 +162,6 @@ static bool cmd_redirect_generate { sieve_operation_emit(cgenv->sblock, NULL, &cmd_redirect_operation); - /* Emit line number */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -179,10 +176,6 @@ static bool cmd_redirect_operation_dump sieve_code_dumpf(denv, "REDIRECT"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - if ( !sieve_code_dumper_print_optional_operands(denv, address) ) return FALSE; @@ -205,10 +198,7 @@ static int cmd_redirect_operation_execute int ret = 0; /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands (side effects) */ if ( (ret=sieve_interpreter_handle_optional_operands diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c index 1d963ab13ee3bf8d62e8d6f0d1a4849d055f677b..994cf513701a8b68d8f2049819e74da1161ad813 100644 --- a/src/lib-sieve/ext-fileinto.c +++ b/src/lib-sieve/ext-fileinto.c @@ -125,9 +125,6 @@ static bool cmd_fileinto_generate { sieve_operation_emit(cgenv->sblock, cmd->ext, &fileinto_operation); - /* Emit line number */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -142,10 +139,6 @@ static bool ext_fileinto_operation_dump sieve_code_dumpf(denv, "FILEINTO"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - if ( !sieve_code_dumper_print_optional_operands(denv, address) ) { return FALSE; } @@ -163,7 +156,7 @@ static int ext_fileinto_operation_execute struct sieve_side_effects_list *slist = NULL; string_t *folder; const char *mailbox; - unsigned int source_line; + unsigned int source_line; int ret = 0; /* @@ -171,10 +164,7 @@ static int ext_fileinto_operation_execute */ /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands */ if ( (ret=sieve_interpreter_handle_optional_operands(renv, address, &slist)) diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c index 3b8f70f027885d5a77d6e8a72c14f082ee64245c..7907303db521634155ecfe0a90c615d4395dddb0 100644 --- a/src/lib-sieve/ext-reject.c +++ b/src/lib-sieve/ext-reject.c @@ -235,9 +235,6 @@ static bool cmd_reject_generate else sieve_operation_emit(cgenv->sblock, cmd->ext, &ereject_operation); - /* Emit line number */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -253,10 +250,6 @@ static bool ext_reject_operation_dump sieve_code_dumpf(denv, "%s", sieve_operation_mnemonic(op)); sieve_code_descend(denv); - - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; if ( !sieve_code_dumper_print_optional_operands(denv, address) ) return FALSE; @@ -281,10 +274,7 @@ static int ext_reject_operation_execute int ret; /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, op->address); /* Optional operands (side effects) */ if ( (ret=sieve_interpreter_handle_optional_operands diff --git a/src/lib-sieve/plugins/enotify/cmd-notify.c b/src/lib-sieve/plugins/enotify/cmd-notify.c index 4e9500e68c66516f85756a061468a00e789823d0..8dc834d5bca3feb5a0fef9dc699ca7cfb44ea63a 100644 --- a/src/lib-sieve/plugins/enotify/cmd-notify.c +++ b/src/lib-sieve/plugins/enotify/cmd-notify.c @@ -336,9 +336,6 @@ static bool cmd_notify_generate { sieve_operation_emit(cgenv->sblock, cmd->ext, ¬ify_operation); - /* Emit source line */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -355,10 +352,6 @@ static bool cmd_notify_operation_dump sieve_code_dumpf(denv, "NOTIFY"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - /* Dump optional operands */ if ( sieve_operand_optional_present(denv->sblock, address) ) { while ( opt_code != 0 ) { @@ -421,10 +414,7 @@ static int cmd_notify_operation_execute */ /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands */ if ( sieve_operand_optional_present(renv->sblock, address) ) { diff --git a/src/lib-sieve/plugins/notify/cmd-denotify.c b/src/lib-sieve/plugins/notify/cmd-denotify.c index f1512e56c877df4c30f9d63b08ca904b0adeee74..870f646af565fe8e3b226c0e58cff3d7bd8b66fb 100644 --- a/src/lib-sieve/plugins/notify/cmd-denotify.c +++ b/src/lib-sieve/plugins/notify/cmd-denotify.c @@ -220,9 +220,6 @@ static bool cmd_denotify_generate { sieve_operation_emit(cgenv->sblock, cmd->ext, &denotify_operation); - /* Emit source line */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -240,10 +237,6 @@ static bool cmd_denotify_operation_dump sieve_code_dumpf(denv, "%s", sieve_operation_mnemonic(op)); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - /* Dump optional operands */ if ( sieve_operand_optional_present(denv->sblock, address) ) { while ( opt_code != 0 ) { @@ -294,18 +287,11 @@ static int cmd_denotify_operation_execute struct sieve_match_context *mctx; struct sieve_result_iterate_context *rictx; const struct sieve_action *action; - unsigned int source_line; int ret; /* * Read operands */ - - /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } /* Optional operands */ if ( sieve_operand_optional_present(renv->sblock, address) ) { diff --git a/src/lib-sieve/plugins/notify/cmd-notify.c b/src/lib-sieve/plugins/notify/cmd-notify.c index 69586a240ab6272244b0dacc5b285db27a4be61c..aa38e5e4ee78ecb35bfe56570cc2260887b310d6 100644 --- a/src/lib-sieve/plugins/notify/cmd-notify.c +++ b/src/lib-sieve/plugins/notify/cmd-notify.c @@ -355,9 +355,6 @@ static bool cmd_notify_generate { sieve_operation_emit(cgenv->sblock, cmd->ext, ¬ify_old_operation); - /* Emit source line */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ return sieve_generate_arguments(cgenv, cmd, NULL); } @@ -374,10 +371,6 @@ static bool cmd_notify_operation_dump sieve_code_dumpf(denv, "NOTIFY"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - /* Dump optional operands */ if ( sieve_operand_optional_present(denv->sblock, address) ) { while ( opt_code != 0 ) { @@ -436,10 +429,7 @@ static int cmd_notify_operation_execute */ /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands */ if ( sieve_operand_optional_present(renv->sblock, address) ) { diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c index 52dfe4702ed29d7a1263b3d6e6369d31e010a414..48d8e5a30cd0caaaf433ede35614be70bcea73e6 100644 --- a/src/lib-sieve/plugins/vacation/cmd-vacation.c +++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c @@ -465,9 +465,6 @@ static bool cmd_vacation_generate sieve_operation_emit(cgenv->sblock, cmd->ext, &vacation_operation); - /* Emit source line */ - sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd)); - /* Generate arguments */ if ( !sieve_generate_arguments(cgenv, cmd, NULL) ) return FALSE; @@ -490,10 +487,6 @@ static bool ext_vacation_operation_dump sieve_code_dumpf(denv, "VACATION"); sieve_code_descend(denv); - /* Source line */ - if ( !sieve_code_source_line_dump(denv, address) ) - return FALSE; - /* Dump optional operands */ if ( sieve_operand_optional_present(denv->sblock, address) ) { while ( opt_code != 0 ) { @@ -561,10 +554,7 @@ static int ext_vacation_operation_execute */ /* Source line */ - if ( !sieve_code_source_line_read(renv, address, &source_line) ) { - sieve_runtime_trace_error(renv, "invalid source line"); - return SIEVE_EXEC_BIN_CORRUPT; - } + source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address); /* Optional operands */ if ( sieve_operand_optional_present(renv->sblock, address) ) { diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c index ea93fbd1ac7ecfb3bbf1095fe4640ca998d98855..c63a10482bab63efd0b942721836ddb1eeb71ffa 100644 --- a/src/lib-sieve/sieve-code.c +++ b/src/lib-sieve/sieve-code.c @@ -157,38 +157,6 @@ static bool sieve_coded_stringlist_dump return TRUE; } - -/* - * Source line coding - */ - -void sieve_code_source_line_emit -(struct sieve_binary_block *sblock, unsigned int source_line) -{ - (void)sieve_binary_emit_unsigned(sblock, source_line); -} - -bool sieve_code_source_line_dump -(const struct sieve_dumptime_env *denv, sieve_size_t *address) -{ - unsigned int number = 0; - - sieve_code_mark(denv); - if (sieve_binary_read_unsigned(denv->sblock, address, &number) ) { - sieve_code_dumpf(denv, "(source line: %lu)", (unsigned long) number); - - return TRUE; - } - - return FALSE; -} - -bool sieve_code_source_line_read -(const struct sieve_runtime_env *renv, sieve_size_t *address, - unsigned int *source_line_r) -{ - return sieve_binary_read_unsigned(renv->sblock, address, source_line_r); -} /* * Core operands diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h index 46963cea5762410bb65f28503c387b3618f30abb..47583d1415ed801357a31d6d505e3cf4582e6357 100644 --- a/src/lib-sieve/sieve-code.h +++ b/src/lib-sieve/sieve-code.h @@ -32,18 +32,6 @@ sieve_size_t sieve_coded_stringlist_get_end_address sieve_size_t sieve_coded_stringlist_get_current_offset (struct sieve_coded_stringlist *strlist); -/* - * Source line coding - */ - -void sieve_code_source_line_emit - (struct sieve_binary_block *sblock, unsigned int source_line); -bool sieve_code_source_line_dump - (const struct sieve_dumptime_env *denv, sieve_size_t *address); -bool sieve_code_source_line_read - (const struct sieve_runtime_env *renv, sieve_size_t *address, - unsigned int *source_line_r); - /* * Operand object */ diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 0c4e5ee769356854a3cfd17fa253aa6fd2020d1d..c0da74b3696501343aa402cbe23ec62af87d76ad 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -282,6 +282,15 @@ void sieve_runtime_log * Runtime trace */ +unsigned int sieve_runtime_get_source_location +(const struct sieve_runtime_env *renv, sieve_size_t code_address) +{ + if ( renv->interp->dreader != NULL ) + return sieve_binary_debug_read_line(renv->interp->dreader, code_address); + + return 0; +} + #ifdef SIEVE_RUNTIME_TRACE void _sieve_runtime_trace (const struct sieve_runtime_env *runenv, const char *fmt, ...) @@ -465,7 +474,7 @@ int sieve_interpreter_handle_optional_operands * Code execute */ -static int sieve_interpreter_execute_operation +static int sieve_interpreter_operation_execute (struct sieve_interpreter *interp) { struct sieve_operation *oprtn = &(interp->runenv.oprtn); @@ -504,7 +513,7 @@ int sieve_interpreter_continue while ( ret == SIEVE_EXEC_OK && !interp->interrupted && interp->pc < sieve_binary_block_get_size(interp->runenv.sblock) ) { - ret = sieve_interpreter_execute_operation(interp); + ret = sieve_interpreter_operation_execute(interp); if ( ret != SIEVE_EXEC_OK ) { sieve_runtime_trace(&interp->runenv, "[[EXECUTION ABORTED]]"); diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h index 41336be9accc509424441d73138963f1ca26ced9..ba08f8f63aca096a5f59ff078097f7df7b17f6fc 100644 --- a/src/lib-sieve/sieve-interpreter.h +++ b/src/lib-sieve/sieve-interpreter.h @@ -98,6 +98,9 @@ bool sieve_interpreter_get_test_result * Error handling */ +unsigned int sieve_runtime_get_source_location + (const struct sieve_runtime_env *renv, sieve_size_t code_address); + /* This is not particularly user-friendly, so avoid using this.. */ const char *sieve_runtime_location(const struct sieve_runtime_env *runenv);