Mercurial > hg > nginx
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 ' ': |