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