diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c index b867dd8ccdf16ab5e116fde4b29f06599c498349..1ef6919283910186e04b8bba80531f24cd474b07 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c +++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c @@ -1,6 +1,9 @@ /* Copyright (c) 2002-2010 Dovecot Sieve authors, see the included COPYING file */ +#include "lib.h" +#include "unichar.h" + #include "sieve-common.h" #include "sieve-commands.h" #include "sieve-code.h" @@ -238,8 +241,8 @@ bool mod_lower_modify(string_t *in, string_t **result) bool mod_length_modify(string_t *in, string_t **result) { *result = t_str_new(64); - str_printfa(*result, "%llu", (unsigned long long) str_len(in)); - + str_printfa(*result, "%llu", (unsigned long long) + uni_utf8_strlen_n(str_data(in), str_len(in))); return TRUE; } diff --git a/tests/extensions/variables/modifiers.svtest b/tests/extensions/variables/modifiers.svtest index 7252331a736bffc0eb3f08b7d9ed355272a349cf..6948aecabb946ec85e2008ac140ae895f4480144 100644 --- a/tests/extensions/variables/modifiers.svtest +++ b/tests/extensions/variables/modifiers.svtest @@ -1,5 +1,6 @@ require "vnd.dovecot.testsuite"; require "variables"; +require "encoded-character"; /* * Modifiers @@ -138,3 +139,14 @@ test "RFC examples" { test_fail "modified assignment failed (6): ${a}"; } } + +/* RFC mentions `characters' and not octets */ + +test "Modifier :length utf8" { + set "a" "Das ist ${unicode: 00fc}berhaupt nicht m${unicode: 00f6}glich."; + + set :length "b" "${a}"; + if not string "${b}" "32" { + test_fail "incorrect number of unicode characters reported: ${b}/32"; + } +}