# HG changeset patch # User Maxim Dounin # Date 1711764305 -10800 # Node ID c690a902bfeca54eed7dac5d74f2df1a90441914 # Parent 9ca12c95730450f9b701d30add488f3224b01ce0 Mail: handling of read buffer filled with commands. If the whole read buffer was filled with commands during authentication, exactly matching the buffer boundary, this did not cause the "client sent too long command" error, but might result in read events being disabled for the connection, notably with level-triggered event methods, leading to a connection hang. Fix is to ensure that s->blocked is set in case of c->read->ready, so command reading is resumed after sending responses to previous commands. diff --git a/src/mail/ngx_mail_imap_handler.c b/src/mail/ngx_mail_imap_handler.c --- a/src/mail/ngx_mail_imap_handler.c +++ b/src/mail/ngx_mail_imap_handler.c @@ -226,7 +226,7 @@ ngx_mail_imap_auth_state(ngx_event_t *re ngx_str_set(&s->out, imap_next); } - if (s->buffer->pos < s->buffer->last) { + if (s->buffer->pos < s->buffer->last || c->read->ready) { s->blocked = 1; } diff --git a/src/mail/ngx_mail_pop3_handler.c b/src/mail/ngx_mail_pop3_handler.c --- a/src/mail/ngx_mail_pop3_handler.c +++ b/src/mail/ngx_mail_pop3_handler.c @@ -262,7 +262,7 @@ ngx_mail_pop3_auth_state(ngx_event_t *re } } - if (s->buffer->pos < s->buffer->last) { + if (s->buffer->pos < s->buffer->last || c->read->ready) { s->blocked = 1; } diff --git a/src/mail/ngx_mail_smtp_handler.c b/src/mail/ngx_mail_smtp_handler.c --- a/src/mail/ngx_mail_smtp_handler.c +++ b/src/mail/ngx_mail_smtp_handler.c @@ -550,7 +550,7 @@ ngx_mail_smtp_auth_state(ngx_event_t *re } } - if (s->buffer->pos < s->buffer->last) { + if (s->buffer->pos < s->buffer->last || c->read->ready) { s->blocked = 1; }