]> git.kaiwu.me - nginx.git/commitdiff
Mail: handle smtp multiline replies.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 30 Sep 2013 18:10:03 +0000 (22:10 +0400)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 30 Sep 2013 18:10:03 +0000 (22:10 +0400)
See here for details:

http://nginx.org/pipermail/nginx/2010-August/021713.html
http://nginx.org/pipermail/nginx/2010-August/021784.html
http://nginx.org/pipermail/nginx/2010-August/021785.html

src/mail/ngx_mail_proxy_module.c

index ed9e0e2d12325675f5f0a82803fb2856fd39262b..02222c122ab84e382b9daf5627f7a516a81754b8 100644 (file)
@@ -707,7 +707,7 @@ ngx_mail_proxy_dummy_handler(ngx_event_t *wev)
 static ngx_int_t
 ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state)
 {
-    u_char                 *p;
+    u_char                 *p, *m;
     ssize_t                 n;
     ngx_buf_t              *b;
     ngx_mail_proxy_conf_t  *pcf;
@@ -784,6 +784,25 @@ ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state)
         break;
 
     default: /* NGX_MAIL_SMTP_PROTOCOL */
+
+        if (p[3] == '-') {
+            /* multiline reply, check if we got last line */
+
+            m = b->last - (sizeof(CRLF "200" CRLF) - 1);
+
+            while (m > p) {
+                if (m[0] == CR && m[1] == LF) {
+                    break;
+                }
+
+                m--;
+            }
+
+            if (m <= p || m[5] == '-') {
+                return NGX_AGAIN;
+            }
+        }
+
         switch (state) {
 
         case ngx_smtp_start: