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;
     }

Reply via email to