From: Stephan Bosch Date: Wed, 16 Sep 2020 23:33:52 +0000 (+0200) Subject: lib-mail: message-header-encode - Fix encoding of 0x7F byte for Q encoding. X-Git-Tag: 2.3.13~113 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d35de6b65208c84a95ad32ccf462dffb5eb9039;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: message-header-encode - Fix encoding of 0x7F byte for Q encoding. It was not escaped. --- diff --git a/src/lib-mail/message-header-encode.c b/src/lib-mail/message-header-encode.c index 35454aa67b..1958d2abd0 100644 --- a/src/lib-mail/message-header-encode.c +++ b/src/lib-mail/message-header-encode.c @@ -94,7 +94,7 @@ void message_header_encode_q(const unsigned char *input, unsigned int len, str_printfa(output, "=%02X", input[i]); break; default: - if (input[i] < 32 || (input[i] & 0x80) != 0) { + if (input[i] < 0x20 || input[i] > 0x7e) { line_len_left -= 2; str_printfa(output, "=%02X", input[i]); } else { diff --git a/src/lib-mail/test-message-header-decode.c b/src/lib-mail/test-message-header-decode.c index 273c5a23b5..8ac9f9fdde 100644 --- a/src/lib-mail/test-message-header-decode.c +++ b/src/lib-mail/test-message-header-decode.c @@ -60,6 +60,33 @@ static void test_message_header_decode_read_overflow(void) test_end(); } +static void check_encoded(string_t *encoded, unsigned int test_idx) +{ + const unsigned char *enc = str_data(encoded), *p, *pend; + size_t enc_len = str_len(encoded), cur_line_len = 0; + + p = enc; + pend = enc + enc_len; + while (p < pend) { + if (*p == '\r') { + p++; + continue; + } + if (*p == '\n') { + test_assert_idx(cur_line_len <= 76, test_idx); + cur_line_len = 0; + p++; + continue; + } + cur_line_len++; + test_assert_idx((*p >= 0x20 && *p <= 0x7e) || *p == '\t', + test_idx); + p++; + } + + test_assert_idx(cur_line_len <= 76, test_idx); +} + static void test_message_header_decode_encode_random(void) { string_t *encoded, *decoded; @@ -82,6 +109,7 @@ static void test_message_header_decode_encode_random(void) /* test Q */ message_header_encode_q(buf, buflen, encoded, 0); + check_encoded(encoded, i); message_header_decode_utf8(encoded->data, encoded->used, decoded, NULL); test_assert_idx(decoded->used == buflen && @@ -92,6 +120,7 @@ static void test_message_header_decode_encode_random(void) str_truncate(decoded, 0); message_header_encode_b(buf, buflen, encoded, 0); + check_encoded(encoded, i); message_header_decode_utf8(encoded->data, encoded->used, decoded, NULL); test_assert_idx(decoded->used == buflen &&