From: Aki Tuomi Date: Mon, 26 Jan 2026 12:55:08 +0000 (+0200) Subject: [PATCH] lib-mail: ostream-dot - Optimize stream writing X-Git-Tag: archive/raspbian/1%2.4.1+dfsg1-6+rpi1+deb13u7^2~71 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=22db1a79c35c727a30a6236f56e8572f3b7ac4e7;p=dovecot.git [PATCH] lib-mail: ostream-dot - Optimize stream writing Use i_memcspn() to figure out how much we can skip. Gbp-Pq: Name 0001-lib-mail-ostream-dot-Optimize-stream-writing.patch --- diff --git a/src/lib-mail/ostream-dot.c b/src/lib-mail/ostream-dot.c index f5bfa72..4fa868b 100644 --- a/src/lib-mail/ostream-dot.c +++ b/src/lib-mail/ostream-dot.c @@ -108,9 +108,17 @@ o_stream_dot_sendv(struct ostream_private *stream, for (; p < pend && (size_t)(p-data)+2 < max_bytes; p++) { char add = 0; + size = pend - p; switch (dstream->state) { /* none */ - case STREAM_STATE_NONE: + case STREAM_STATE_NONE: { + size_t maxlen = I_MIN(size, max_bytes - ((size_t)(p - data) + 2)); + p = CONST_PTR_OFFSET(p, i_memcspn(p, maxlen, "\r\n", 2)); + i_assert(p <= pend); + if (p == pend) { + p--; + continue; + } switch (*p) { case '\n': dstream->state = STREAM_STATE_CRLF; @@ -122,8 +130,10 @@ o_stream_dot_sendv(struct ostream_private *stream, break; } break; + } /* got CR */ case STREAM_STATE_CR: + i_assert(p < pend); switch (*p) { case '\r': break; @@ -138,6 +148,7 @@ o_stream_dot_sendv(struct ostream_private *stream, /* got CRLF, or the first line */ case STREAM_STATE_INIT: case STREAM_STATE_CRLF: + i_assert(p < pend); switch (*p) { case '\r': dstream->state = STREAM_STATE_CR; @@ -186,6 +197,7 @@ o_stream_dot_sendv(struct ostream_private *stream, if (max_bytes == 0) break; + i_assert(p <= pend); chunk = ((size_t)(p-data) >= max_bytes ? max_bytes : (size_t)(p - data)); if (chunk > 0) {