diff src/imap/ngx_imap_parse.c @ 543:511a89da35ad release-0.2.0

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.
author Igor Sysoev <igor@sysoev.ru>
date Fri, 23 Sep 2005 11:02:22 +0000
parents e5d7d0334fdb
children 4d9ea73a627a
line wrap: on
line diff
--- 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_ima
         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_ima
                     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_ima
                 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_ima
             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_ima
 
         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);