Welcome! Log In Create A New Profile

Advanced

[nginx] Mail: fixed handling of blocked client read events in proxy.

Sergey Kandaurov
March 24, 2023 09:20AM
details: https://hg.nginx.org/nginx/rev/a5e6e8510634
branches:
changeset: 8151:a5e6e8510634
user: Maxim Dounin <mdounin@mdounin.ru>
date: Fri Mar 24 02:53:21 2023 +0300
description:
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.

diffstat:

src/mail/ngx_mail_proxy_module.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)

diffs (36 lines):

diff -r 8771d35d55d0 -r a5e6e8510634 src/mail/ngx_mail_proxy_module.c
--- a/src/mail/ngx_mail_proxy_module.c Fri Mar 10 07:43:50 2023 +0300
+++ b/src/mail/ngx_mail_proxy_module.c Fri Mar 24 02:53:21 2023 +0300
@@ -327,7 +327,9 @@ ngx_mail_proxy_pop3_handler(ngx_event_t
c->log->action = NULL;
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);
}

@@ -486,7 +488,9 @@ ngx_mail_proxy_imap_handler(ngx_event_t
c->log->action = NULL;
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);
}

@@ -821,7 +825,9 @@ ngx_mail_proxy_smtp_handler(ngx_event_t
c->log->action = NULL;
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);
}

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Mail: fixed handling of blocked client read events in proxy.

Sergey Kandaurov 512 March 24, 2023 09:20AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 312
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready