# HG changeset patch # User Maxim Dounin # Date 1711764331 -10800 # Node ID d7fd0acdea64072cfb0891521e4d15a1e9935502 # Parent c690a902bfeca54eed7dac5d74f2df1a90441914 Mail: handling of pipelined commands which cross buffer boundary. Previously, pipelined commands which cross buffer boundary were rejected as too long, even if the command itself was short enough to be handled within the client buffer. Fix is to move non-processed commands to the start of the buffer after the previous command is fully processed. diff -r c690a902bfec -r d7fd0acdea64 src/mail/ngx_mail_imap_handler.c --- a/src/mail/ngx_mail_imap_handler.c Sat Mar 30 05:05:05 2024 +0300 +++ b/src/mail/ngx_mail_imap_handler.c Sat Mar 30 05:05:31 2024 +0300 @@ -102,6 +102,7 @@ ngx_mail_imap_auth_state(ngx_event_t *rev) { u_char *p; + size_t n; ngx_int_t rc; ngx_uint_t tag; ngx_connection_t *c; @@ -285,6 +286,12 @@ if (s->buffer->pos == s->buffer->last) { s->buffer->pos = s->buffer->start; s->buffer->last = s->buffer->start; + + } else { + n = s->buffer->last - s->buffer->pos; + ngx_memmove(s->buffer->start, s->buffer->pos, n); + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start + n; } s->tag.len = 0; diff -r c690a902bfec -r d7fd0acdea64 src/mail/ngx_mail_pop3_handler.c --- a/src/mail/ngx_mail_pop3_handler.c Sat Mar 30 05:05:05 2024 +0300 +++ b/src/mail/ngx_mail_pop3_handler.c Sat Mar 30 05:05:31 2024 +0300 @@ -119,6 +119,7 @@ void ngx_mail_pop3_auth_state(ngx_event_t *rev) { + size_t n; ngx_int_t rc; ngx_connection_t *c; ngx_mail_session_t *s; @@ -291,6 +292,12 @@ if (s->buffer->pos == s->buffer->last) { s->buffer->pos = s->buffer->start; s->buffer->last = s->buffer->start; + + } else { + n = s->buffer->last - s->buffer->pos; + ngx_memmove(s->buffer->start, s->buffer->pos, n); + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start + n; } if (s->state) { diff -r c690a902bfec -r d7fd0acdea64 src/mail/ngx_mail_smtp_handler.c --- a/src/mail/ngx_mail_smtp_handler.c Sat Mar 30 05:05:05 2024 +0300 +++ b/src/mail/ngx_mail_smtp_handler.c Sat Mar 30 05:05:31 2024 +0300 @@ -430,6 +430,7 @@ void ngx_mail_smtp_auth_state(ngx_event_t *rev) { + size_t n; ngx_int_t rc; ngx_connection_t *c; ngx_mail_session_t *s; @@ -577,6 +578,12 @@ if (s->buffer->pos == s->buffer->last) { s->buffer->pos = s->buffer->start; s->buffer->last = s->buffer->start; + + } else { + n = s->buffer->last - s->buffer->pos; + ngx_memmove(s->buffer->start, s->buffer->pos, n); + s->buffer->pos = s->buffer->start; + s->buffer->last = s->buffer->start + n; } if (s->state) {