details: http://freenginx.org/hg/nginx/rev/5b4f651713d7
branches:
changeset: 9490:5b4f651713d7
user: Maxim Dounin <[email protected]>
date: Thu Mar 26 06:51:47 2026 +0300
description:
Mail: improved error reporting while connecting to upstream.
Previously, when c->send() failed to fully send a command after connecting
to the upstream server, no error was logged, yet the connection was closed
with an internal error.
diffstat:
src/mail/ngx_mail_proxy_module.c | 36 +++++++++++++++++++++++++++++++++---
1 files changed, 33 insertions(+), 3 deletions(-)
diffs (93 lines):
diff --git a/src/mail/ngx_mail_proxy_module.c b/src/mail/ngx_mail_proxy_module.c
--- a/src/mail/ngx_mail_proxy_module.c
+++ b/src/mail/ngx_mail_proxy_module.c
@@ -227,6 +227,7 @@ static void
ngx_mail_proxy_pop3_handler(ngx_event_t *rev)
{
u_char *p;
+ ssize_t n;
ngx_int_t rc;
ngx_str_t line;
ngx_connection_t *c;
@@ -344,11 +345,20 @@ ngx_mail_proxy_pop3_handler(ngx_event_t
break;
}
- if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
+ n = c->send(c, line.data, line.len);
+
+ if (n == NGX_ERROR) {
+ ngx_mail_proxy_internal_server_error(s);
+ return;
+ }
+
+ if (n != (ssize_t) line.len) {
/*
* we treat the incomplete sending as NGX_ERROR
* because it is very strange here
*/
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "sent only %z of %uz", n, line.len);
ngx_mail_proxy_internal_server_error(s);
return;
}
@@ -367,6 +377,7 @@ static void
ngx_mail_proxy_imap_handler(ngx_event_t *rev)
{
u_char *p;
+ ssize_t n;
ngx_int_t rc;
ngx_str_t line;
ngx_connection_t *c;
@@ -505,11 +516,20 @@ ngx_mail_proxy_imap_handler(ngx_event_t
break;
}
- if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
+ n = c->send(c, line.data, line.len);
+
+ if (n == NGX_ERROR) {
+ ngx_mail_proxy_internal_server_error(s);
+ return;
+ }
+
+ if (n != (ssize_t) line.len) {
/*
* we treat the incomplete sending as NGX_ERROR
* because it is very strange here
*/
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "sent only %z of %uz", n, line.len);
ngx_mail_proxy_internal_server_error(s);
return;
}
@@ -528,6 +548,7 @@ static void
ngx_mail_proxy_smtp_handler(ngx_event_t *rev)
{
u_char *p;
+ ssize_t n;
ngx_int_t rc;
ngx_str_t line, auth, encoded;
ngx_buf_t *b;
@@ -842,11 +863,20 @@ ngx_mail_proxy_smtp_handler(ngx_event_t
break;
}
- if (c->send(c, line.data, line.len) < (ssize_t) line.len) {
+ n = c->send(c, line.data, line.len);
+
+ if (n == NGX_ERROR) {
+ ngx_mail_proxy_internal_server_error(s);
+ return;
+ }
+
+ if (n != (ssize_t) line.len) {
/*
* we treat the incomplete sending as NGX_ERROR
* because it is very strange here
*/
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "sent only %z of %uz", n, line.len);
ngx_mail_proxy_internal_server_error(s);
return;
}