]> git.kaiwu.me - nginx.git/commitdiff
Mail: fixed handling of invalid SMTP commands split between reads.
authorMaxim Dounin <mdounin@mdounin.ru>
Wed, 19 May 2021 00:13:15 +0000 (03:13 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Wed, 19 May 2021 00:13:15 +0000 (03:13 +0300)
Previously, if an invalid SMTP command was split between reads, nginx failed
to wait for LF before returning an error, and interpreted the rest of the
command received later as a separate command.

The sw_invalid state in ngx_mail_smtp_parse_command(), introduced in
04e43d03e153, did not work, since ngx_mail_smtp_auth_state() clears
s->state when returning an error due to NGX_MAIL_PARSE_INVALID_COMMAND.
And not clearing s->state will introduce another problem: the rest
of the command would trigger duplicate error when rest of the command is
received.

Fix is to return NGX_AGAIN from ngx_mail_smtp_parse_command() until full
command is received.

src/mail/ngx_mail_parse.c

index 2c2cdffa1179e8862b501a5deed4191a855f5954..0712ad5dc49530f9fd6de38aa9a2152b2d8e7e60 100644 (file)
@@ -846,14 +846,14 @@ invalid:
     for (p = s->buffer->pos; p < s->buffer->last; p++) {
         if (*p == LF) {
             s->state = sw_start;
-            p++;
-            break;
+            s->buffer->pos = p + 1;
+            return NGX_MAIL_PARSE_INVALID_COMMAND;
         }
     }
 
     s->buffer->pos = p;
 
-    return NGX_MAIL_PARSE_INVALID_COMMAND;
+    return NGX_AGAIN;
 }