From 31eb8c015d58a5b36b9578d4ee6c217e16cb776f Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Fri, 23 Sep 2005 11:02:22 +0000 Subject: nginx-0.2.0-RELEASE import *) The pid-file names used during online upgrade was changed and now is not required a manual rename operation. The old master process adds the ".oldbin" suffix to its pid-file and executes a new binary file. The new master process creates usual pid-file without the ".newbin" suffix. If the master process exits, then old master process renames back its pid-file with the ".oldbin" suffix to the pid-file without suffix. *) Change: the "worker_connections" directive, new name of the "connections" directive; now the directive specifies maximum number of connections, but not maximum socket descriptor number. *) Feature: SSL supports the session cache inside one worker process. *) Feature: the "satisfy_any" directive. *) Change: the ngx_http_access_module and ngx_http_auth_basic_module do not run for subrequests. *) Feature: the "worker_rlimit_nofile" and "worker_rlimit_sigpending" directives. *) Bugfix: if all backend using in load-balancing failed after one error, then nginx did not try do connect to them during 60 seconds. *) Bugfix: in IMAP/POP3 command argument parsing. Thanks to Rob Mueller. *) Bugfix: errors while using SSL in IMAP/POP3 proxy. *) Bugfix: errors while using SSI and gzipping. *) Bugfix: the "Expires" and "Cache-Control" header lines were omitted from the 304 responses. Thanks to Alexandr Kukushkin. --- src/imap/ngx_imap_parse.c | 55 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'src/imap/ngx_imap_parse.c') diff --git a/src/imap/ngx_imap_parse.c b/src/imap/ngx_imap_parse.c index 374605ec5..473825c92 100644 --- a/src/imap/ngx_imap_parse.c +++ b/src/imap/ngx_imap_parse.c @@ -20,7 +20,9 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s) sw_command, sw_spaces_before_argument, sw_argument, + sw_backslash, sw_literal, + sw_no_sync_literal_argument, sw_start_literal_argument, sw_literal_argument, sw_end_literal_argument, @@ -225,6 +227,22 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s) goto done; } break; + case '\\': + if (s->quoted) { + s->backslash = 1; + state = sw_backslash; + } + break; + } + break; + + case sw_backslash: + switch (ch) { + case CR: + case LF: + goto invalid; + default: + state = sw_argument; } break; @@ -237,6 +255,18 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s) state = sw_start_literal_argument; break; } + if (ch == '+') { + state = sw_no_sync_literal_argument; + break; + } + goto invalid; + + case sw_no_sync_literal_argument: + if (ch == '}') { + s->no_sync_literal = 1; + state = sw_start_literal_argument; + break; + } goto invalid; case sw_start_literal_argument: @@ -246,10 +276,17 @@ ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s) case LF: s->buffer->pos = p + 1; s->arg_start = p + 1; - s->state = sw_literal_argument; - return NGX_IMAP_NEXT; + if (s->no_sync_literal == 0) { + s->state = sw_literal_argument; + return NGX_IMAP_NEXT; + } + state = sw_literal_argument; + s->no_sync_literal = 0; + break; + default: + goto invalid; } - goto invalid; + break; case sw_literal_argument: if (s->literal_len && --s->literal_len) { @@ -312,9 +349,11 @@ done: } arg->len = s->arg_end - s->arg_start; arg->data = s->arg_start; + s->arg_start = NULL; s->cmd_start = NULL; s->quoted = 0; + s->no_sync_literal = 0; s->literal_len = 0; } @@ -326,6 +365,7 @@ invalid: s->state = sw_start; s->quoted = 0; + s->no_sync_literal = 0; s->literal_len = 0; return NGX_IMAP_PARSE_INVALID_COMMAND; @@ -432,7 +472,14 @@ ngx_int_t ngx_pop3_parse_command(ngx_imap_session_t *s) case sw_argument: switch (ch) { - case ' ': + + /* + * the space should be considered part of the at username + * or password, but not of argument in other commands + * + * case ' ': + */ + case CR: case LF: arg = ngx_array_push(&s->args); -- cgit v1.2.3