Mail: fixed reading with fully filled buffer (ticket #2159).
With SMTP pipelining, ngx_mail_read_command() can be called with s->buffer without any space available, to parse additional commands received to the buffer on previous calls. Previously, this resulted in recv() being called with zero length, resulting in zero being returned, which was interpreted as a connection close by the client, so nginx silently closed connection. Fix is to avoid calling c->recv() if there is no free space in the buffer, but continue parsing of the already received commands.
This commit is contained in:
parent
27cfa45999
commit
70bd2beda2
1 changed files with 14 additions and 11 deletions
|
@ -833,20 +833,23 @@ ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c)
|
||||||
ngx_str_t l;
|
ngx_str_t l;
|
||||||
ngx_mail_core_srv_conf_t *cscf;
|
ngx_mail_core_srv_conf_t *cscf;
|
||||||
|
|
||||||
n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);
|
if (s->buffer->last < s->buffer->end) {
|
||||||
|
|
||||||
if (n == NGX_ERROR || n == 0) {
|
n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);
|
||||||
ngx_mail_close_connection(c);
|
|
||||||
return NGX_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n > 0) {
|
if (n == NGX_ERROR || n == 0) {
|
||||||
s->buffer->last += n;
|
ngx_mail_close_connection(c);
|
||||||
}
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if (n == NGX_AGAIN) {
|
if (n > 0) {
|
||||||
if (s->buffer->pos == s->buffer->last) {
|
s->buffer->last += n;
|
||||||
return NGX_AGAIN;
|
}
|
||||||
|
|
||||||
|
if (n == NGX_AGAIN) {
|
||||||
|
if (s->buffer->pos == s->buffer->last) {
|
||||||
|
return NGX_AGAIN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue