diff --git a/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c b/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c index a82e81dfbf6226a583b6c6a575739dac4d077c41..fe5477c397a8eea47f9f74dc5e24acf2b9247d5a 100644 --- a/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c +++ b/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c @@ -67,6 +67,11 @@ bool mod_encodeurl_modify(string_t *in, string_t **result) unsigned int i; const unsigned char *c; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(2*str_len(in)); c = str_data(in); diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c index ca30b56e374647f354453c11a22ee3f6fddca592..43997fa36535557ac3c7efb6c9b34d501c07ac12 100644 --- a/src/lib-sieve/plugins/variables/cmd-set.c +++ b/src/lib-sieve/plugins/variables/cmd-set.c @@ -326,26 +326,24 @@ static int cmd_set_operation_execute break; } - if ( str_len(value) > 0 ) { - if ( modf.def != NULL && modf.def->modify != NULL ) { - if ( !modf.def->modify(value, &new_value) ) { - value = NULL; - ret = SIEVE_EXEC_FAILURE; - break; - } - - sieve_runtime_trace_here - (renv, SIEVE_TRLVL_COMMANDS, "modify :%s \"%s\" => \"%s\"", - sieve_variables_modifier_name(&modf), str_c(value), str_c(new_value)); - - value = new_value; - if ( value == NULL ) - break; - - /* Hold value within limits */ - if ( str_len(value) > EXT_VARIABLES_MAX_VARIABLE_SIZE ) - str_truncate(value, EXT_VARIABLES_MAX_VARIABLE_SIZE); + if ( modf.def != NULL && modf.def->modify != NULL ) { + if ( !modf.def->modify(value, &new_value) ) { + value = NULL; + ret = SIEVE_EXEC_FAILURE; + break; } + + sieve_runtime_trace_here + (renv, SIEVE_TRLVL_COMMANDS, "modify :%s \"%s\" => \"%s\"", + sieve_variables_modifier_name(&modf), str_c(value), str_c(new_value)); + + value = new_value; + if ( value == NULL ) + break; + + /* Hold value within limits */ + if ( str_len(value) > EXT_VARIABLES_MAX_VARIABLE_SIZE ) + str_truncate(value, EXT_VARIABLES_MAX_VARIABLE_SIZE); } } diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c index e6e9d9408bbe6e92e851da737131295eac9334ef..5c1790a90feb08f297e223d73c17cb1b9ecaf2a1 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c +++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c @@ -190,6 +190,11 @@ bool mod_upperfirst_modify(string_t *in, string_t **result) { char *content; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(str_len(in)); str_append_str(*result, in); @@ -203,6 +208,11 @@ bool mod_lowerfirst_modify(string_t *in, string_t **result) { char *content; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(str_len(in)); str_append_str(*result, in); @@ -216,6 +226,11 @@ bool mod_upper_modify(string_t *in, string_t **result) { char *content; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(str_len(in)); str_append_str(*result, in); @@ -229,6 +244,11 @@ bool mod_lower_modify(string_t *in, string_t **result) { char *content; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(str_len(in)); str_append_str(*result, in); @@ -251,6 +271,11 @@ bool mod_quotewildcard_modify(string_t *in, string_t **result) unsigned int i; const char *content; + if ( str_len(in) == 0 ) { + *result = in; + return TRUE; + } + *result = t_str_new(str_len(in) * 2); content = (const char *) str_data(in); diff --git a/tests/extensions/variables/modifiers.svtest b/tests/extensions/variables/modifiers.svtest index 60b174fa5955f42f5b748ee0474f1b46f79233e0..37068b63db38c516a499226108e99b5489fc4f6e 100644 --- a/tests/extensions/variables/modifiers.svtest +++ b/tests/extensions/variables/modifiers.svtest @@ -70,7 +70,15 @@ test "Modifiers :lowerfirst :upper" { } } -test "Modifier :length" { +test "Modifier :length (empty)" { + set :length "test" ""; + + if not string :is "${test}" "0" { + test_fail "modified variable assignment failed"; + } +} + +test "Modifier :length (simple)" { set :length "test" "VaLuE"; if not string :is "${test}" "5" {