From: Marco Bettini Date: Mon, 20 Apr 2026 09:50:54 +0000 (+0000) Subject: [PATCH 2/4] lib-mail: o_stream_dot_sendv() - Fix boundary off by one X-Git-Tag: archive/raspbian/1%2.4.1+dfsg1-6+rpi1+deb13u7^2~69 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=42ad403e97b7a6c0635c986c285072f0fe87c0ce;p=dovecot.git [PATCH 2/4] lib-mail: o_stream_dot_sendv() - Fix boundary off by one Gbp-Pq: Name 0002-lib-mail-o_stream_dot_sendv-Fix-boundary-off-by-one.patch --- diff --git a/src/lib-mail/ostream-dot.c b/src/lib-mail/ostream-dot.c index 6bc9aa2..9d5411a 100644 --- a/src/lib-mail/ostream-dot.c +++ b/src/lib-mail/ostream-dot.c @@ -105,7 +105,7 @@ o_stream_dot_sendv(struct ostream_private *stream, p = data; pend = CONST_PTR_OFFSET(data, size); - for (; p < pend && (size_t)(p-data)+2 < max_bytes; p++) { + for (; p < pend && ((size_t)(p - data) + 2) <= max_bytes; p++) { char add = 0; size = pend - p; diff --git a/src/lib-mail/test-ostream-dot.c b/src/lib-mail/test-ostream-dot.c index 9ddb563..6a1813d 100644 --- a/src/lib-mail/test-ostream-dot.c +++ b/src/lib-mail/test-ostream-dot.c @@ -92,11 +92,34 @@ static void test_ostream_dot_parent_almost_full(void) test_end(); } +static void test_ostream_dot_parent_exact_fit(void) +{ + buffer_t *output_data; + struct ostream *test_output, *output; + ssize_t ret; + + test_begin("dot ostream parent exact fit"); + output_data = t_buffer_create(1024); + test_output = test_ostream_create_nonblocking(output_data, 2); + test_ostream_set_max_output_size(test_output, 2); + + output = o_stream_create_dot(test_output, FALSE); + ret = o_stream_send(output, ".", 1); + test_assert(ret == 1); + test_assert_ucmp(output_data->used, ==, 2); + test_assert_memcmp(output_data->data, output_data->used, "..", 2); + + o_stream_unref(&output); + o_stream_unref(&test_output); + test_end(); +} + int main(void) { static void (*const test_functions[])(void) = { test_ostream_dot, test_ostream_dot_parent_almost_full, + test_ostream_dot_parent_exact_fit, NULL }; return test_run(test_functions);