comparison src/mail/ngx_mail_parse.c @ 7841:ccdf83bee8c1

Mail: fixed backslash handling in IMAP literals. Previously, s->backslash was set if any of the arguments was a quoted string with a backslash character. After successful command parsing this resulted in all arguments being filtered to remove backslashes. This is, however, incorrect, as backslashes should not be removed from IMAP literals. For example: S: * OK IMAP4 ready C: a01 login {9} S: + OK C: user\name "pass\"word" S: * BAD internal server error resulted in "Auth-User: username" instead of "Auth-User: user\name" as it should. Fix is to apply backslash filtering on per-argument basis during parsing.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 19 May 2021 03:13:23 +0300
parents 379d461eccf4
children 4b15f1b92100
comparison
equal deleted inserted replaced
7840:379d461eccf4 7841:ccdf83bee8c1
225 225
226 226
227 ngx_int_t 227 ngx_int_t
228 ngx_mail_imap_parse_command(ngx_mail_session_t *s) 228 ngx_mail_imap_parse_command(ngx_mail_session_t *s)
229 { 229 {
230 u_char ch, *p, *c; 230 u_char ch, *p, *c, *dst, *src, *end;
231 ngx_str_t *arg; 231 ngx_str_t *arg;
232 enum { 232 enum {
233 sw_start = 0, 233 sw_start = 0,
234 sw_spaces_before_command, 234 sw_spaces_before_command,
235 sw_command, 235 sw_command,
468 if (arg == NULL) { 468 if (arg == NULL) {
469 return NGX_ERROR; 469 return NGX_ERROR;
470 } 470 }
471 arg->len = p - s->arg_start; 471 arg->len = p - s->arg_start;
472 arg->data = s->arg_start; 472 arg->data = s->arg_start;
473
474 if (s->backslash) {
475 dst = s->arg_start;
476 end = p;
477
478 for (src = dst; src < end; dst++) {
479 *dst = *src;
480 if (*src++ == '\\') {
481 *dst = *src++;
482 }
483 }
484
485 arg->len = dst - s->arg_start;
486 s->backslash = 0;
487 }
488
473 s->arg_start = NULL; 489 s->arg_start = NULL;
474 490
475 switch (ch) { 491 switch (ch) {
476 case '"': 492 case '"':
477 case ' ': 493 case ' ':