diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c index 17083e17a..17cba7435 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-common.c +++ b/src/lib-sieve/plugins/variables/ext-variables-common.c @@ -611,7 +611,7 @@ bool sieve_variable_assign /* Just a precaution, caller should prevent this in the first place */ if ( str_len(varval) > config->max_variable_size ) - str_truncate(varval, config->max_variable_size); + str_truncate_utf8(varval, config->max_variable_size); return TRUE; } @@ -632,7 +632,7 @@ bool sieve_variable_assign_cstr /* Just a precaution, caller should prevent this in the first place */ if ( str_len(varval) > config->max_variable_size ) - str_truncate(varval, config->max_variable_size); + str_truncate_utf8(varval, config->max_variable_size); return TRUE; } diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c index 578779cce..a3ffabb12 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c +++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c @@ -482,8 +482,13 @@ int sieve_variables_modifiers_apply unsigned int i, modf_count; /* Hold value within limits */ - if ( str_len(*value) > config->max_variable_size ) - str_truncate(*value, config->max_variable_size); + if ( str_len(*value) > config->max_variable_size ) { + /* assume variable originates from code, so copy it first */ + string_t *new_value = t_str_new(config->max_variable_size+3); + str_append_str(new_value, *value); + *value = new_value; + str_truncate_utf8(*value, config->max_variable_size); + } if ( !array_is_created(modifiers) ) return SIEVE_EXEC_OK; @@ -513,7 +518,7 @@ int sieve_variables_modifiers_apply /* Hold value within limits */ if ( str_len(*value) > config->max_variable_size ) - str_truncate(*value, config->max_variable_size); + str_truncate_utf8(*value, config->max_variable_size); } } return SIEVE_EXEC_OK; diff --git a/src/lib-sieve/plugins/variables/ext-variables-operands.c b/src/lib-sieve/plugins/variables/ext-variables-operands.c index 86d4076c3..359f3bf57 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-operands.c +++ b/src/lib-sieve/plugins/variables/ext-variables-operands.c @@ -267,7 +267,7 @@ static int opr_match_value_read if ( *str_r == NULL ) *str_r = t_str_new(0); else if ( str_len(*str_r) > config->max_variable_size ) - str_truncate(*str_r, config->max_variable_size); + str_truncate_utf8(*str_r, config->max_variable_size); } return SIEVE_EXEC_OK;