Mercurial > hg > nginx
comparison src/mail/ngx_mail_imap_handler.c @ 7843:b38728495e1a
Mail: IMAP pipelining support.
The change is mostly the same as the SMTP one (04e43d03e153 and 3f5d0af4e40a),
and ensures that nginx is able to properly handle or reject multiple IMAP
commands. The s->cmd field is not really used and set for consistency.
Non-synchronizing literals handling in invalid/unknown commands is limited,
so when a non-synchronizing literal is detected at the end of a discarded
line, the connection is closed.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 19 May 2021 03:13:28 +0300 |
parents | ccdf83bee8c1 |
children | c690a902bfec |
comparison
equal
deleted
inserted
replaced
7842:4b15f1b92100 | 7843:b38728495e1a |
---|---|
224 } else if (rc == NGX_IMAP_NEXT) { | 224 } else if (rc == NGX_IMAP_NEXT) { |
225 tag = 0; | 225 tag = 0; |
226 ngx_str_set(&s->out, imap_next); | 226 ngx_str_set(&s->out, imap_next); |
227 } | 227 } |
228 | 228 |
229 if (s->buffer->pos < s->buffer->last) { | |
230 s->blocked = 1; | |
231 } | |
232 | |
229 switch (rc) { | 233 switch (rc) { |
230 | 234 |
231 case NGX_DONE: | 235 case NGX_DONE: |
232 ngx_mail_auth(s, c); | 236 ngx_mail_auth(s, c); |
233 return; | 237 return; |
273 if (rc != NGX_IMAP_NEXT) { | 277 if (rc != NGX_IMAP_NEXT) { |
274 s->args.nelts = 0; | 278 s->args.nelts = 0; |
275 | 279 |
276 if (s->state) { | 280 if (s->state) { |
277 /* preserve tag */ | 281 /* preserve tag */ |
278 s->arg_start = s->buffer->start + s->tag.len; | 282 s->arg_start = s->buffer->pos; |
279 s->buffer->pos = s->arg_start; | |
280 s->buffer->last = s->arg_start; | |
281 | 283 |
282 } else { | 284 } else { |
283 s->buffer->pos = s->buffer->start; | 285 if (s->buffer->pos == s->buffer->last) { |
284 s->buffer->last = s->buffer->start; | 286 s->buffer->pos = s->buffer->start; |
287 s->buffer->last = s->buffer->start; | |
288 } | |
289 | |
285 s->tag.len = 0; | 290 s->tag.len = 0; |
286 } | 291 } |
287 } | 292 } |
288 | 293 |
289 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { | 294 if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
457 ngx_mail_ssl_conf_t *sslcf; | 462 ngx_mail_ssl_conf_t *sslcf; |
458 | 463 |
459 if (c->ssl == NULL) { | 464 if (c->ssl == NULL) { |
460 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); | 465 sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); |
461 if (sslcf->starttls) { | 466 if (sslcf->starttls) { |
467 s->buffer->pos = s->buffer->start; | |
468 s->buffer->last = s->buffer->start; | |
462 c->read->handler = ngx_mail_starttls_handler; | 469 c->read->handler = ngx_mail_starttls_handler; |
463 return NGX_OK; | 470 return NGX_OK; |
464 } | 471 } |
465 } | 472 } |
466 | 473 |