diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2013-09-30 22:10:03 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2013-09-30 22:10:03 +0400 |
commit | f2b5192c30e51b3376eb09525c0d0a75fda30c38 (patch) | |
tree | 401cdc16577b00aaf3bfe9aee1edcd3064cfa3ac /src/mail/ngx_mail_proxy_module.c | |
parent | 4f6f653f482abc3b963727ea5f2c5d708d8fd605 (diff) | |
download | nginx-f2b5192c30e51b3376eb09525c0d0a75fda30c38.tar.gz nginx-f2b5192c30e51b3376eb09525c0d0a75fda30c38.zip |
Mail: handle smtp multiline replies.
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
Diffstat (limited to 'src/mail/ngx_mail_proxy_module.c')
-rw-r--r-- | src/mail/ngx_mail_proxy_module.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/mail/ngx_mail_proxy_module.c b/src/mail/ngx_mail_proxy_module.c index ed9e0e2d1..02222c122 100644 --- a/src/mail/ngx_mail_proxy_module.c +++ b/src/mail/ngx_mail_proxy_module.c @@ -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: |