mirror of
https://github.com/nginx/nginx.git
synced 2024-11-21 16:28:40 +00:00
Mail: fixed handling of blocked client read events in proxy.
When establishing a connection to the backend, nginx blocks reading from the client with ngx_mail_proxy_block_read(). Previously, such events were lost, and in some cases this resulted in connection hangs. Notably, this affected mail_imap_ssl.t on Windows, since the test closes connections after requesting authentication, but without waiting for any responses (so the connection close events might be lost). Fix is to post an event to read from the client after connecting to the backend if there were blocked events.
This commit is contained in:
parent
11ed95bb53
commit
2ca4355bf0
@ -327,7 +327,9 @@ ngx_mail_proxy_pop3_handler(ngx_event_t *rev)
|
|||||||
c->log->action = NULL;
|
c->log->action = NULL;
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
||||||
|
|
||||||
if (s->buffer->pos < s->buffer->last) {
|
if (s->buffer->pos < s->buffer->last
|
||||||
|
|| s->connection->read->ready)
|
||||||
|
{
|
||||||
ngx_post_event(c->write, &ngx_posted_events);
|
ngx_post_event(c->write, &ngx_posted_events);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,7 +488,9 @@ ngx_mail_proxy_imap_handler(ngx_event_t *rev)
|
|||||||
c->log->action = NULL;
|
c->log->action = NULL;
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
||||||
|
|
||||||
if (s->buffer->pos < s->buffer->last) {
|
if (s->buffer->pos < s->buffer->last
|
||||||
|
|| s->connection->read->ready)
|
||||||
|
{
|
||||||
ngx_post_event(c->write, &ngx_posted_events);
|
ngx_post_event(c->write, &ngx_posted_events);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,7 +825,9 @@ ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
|
|||||||
c->log->action = NULL;
|
c->log->action = NULL;
|
||||||
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in");
|
||||||
|
|
||||||
if (s->buffer->pos < s->buffer->last) {
|
if (s->buffer->pos < s->buffer->last
|
||||||
|
|| s->connection->read->ready)
|
||||||
|
{
|
||||||
ngx_post_event(c->write, &ngx_posted_events);
|
ngx_post_event(c->write, &ngx_posted_events);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user