]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fixed parsing "text" input after OK/NO/BAD/BYE.
authorTimo Sirainen <tss@iki.fi>
Tue, 11 Sep 2012 17:45:38 +0000 (20:45 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 11 Sep 2012 17:45:38 +0000 (20:45 +0300)
src/lib-imap-client/imapc-connection.c

index 9fcacc9849ecc7429b670994eca9219c33f87bc5..3229dd2b97497674aa9bd1516df2f1722297d3c3 100644 (file)
@@ -493,7 +493,8 @@ imapc_connection_read_line_more(struct imapc_connection *conn,
 
        ret = imap_parser_read_args(conn->parser, 0,
                                    IMAP_PARSE_FLAG_LITERAL_SIZE |
-                                   IMAP_PARSE_FLAG_ATOM_ALLCHARS, imap_args_r);
+                                   IMAP_PARSE_FLAG_ATOM_ALLCHARS |
+                                   IMAP_PARSE_FLAG_SERVER_TEXT, imap_args_r);
        if (ret == -2) {
                /* need more data */
                return 0;
@@ -813,6 +814,9 @@ static int imapc_connection_input_banner(struct imapc_connection *conn)
 
        if ((ret = imapc_connection_read_line(conn, &imap_args)) <= 0)
                return ret;
+       /* we already verified that the banner beigns with OK */
+       i_assert(imap_arg_atom_equals(imap_args, "OK"));
+       imap_args++;
 
        if (imapc_connection_handle_imap_resp_text(conn, imap_args,
                                                   &key, &value) < 0)
@@ -836,6 +840,8 @@ static int imapc_connection_input_banner(struct imapc_connection *conn)
 static int imapc_connection_input_untagged(struct imapc_connection *conn)
 {
        const struct imap_arg *imap_args;
+       const unsigned char *data;
+       size_t size;
        const char *name, *value;
        struct imap_parser *parser;
        struct imapc_untagged_reply reply;
@@ -843,13 +849,13 @@ static int imapc_connection_input_untagged(struct imapc_connection *conn)
 
        if (conn->state == IMAPC_CONNECTION_STATE_CONNECTING) {
                /* input banner */
-               name = imap_parser_read_word(conn->parser);
-               if (name == NULL)
+               data = i_stream_get_data(conn->input, &size);
+               if (size < 3 && memchr(data, '\n', size) == NULL)
                        return 0;
-
-               if (strcasecmp(name, "OK") != 0) {
+               if (i_memcasecmp(data, "OK ", 3) != 0) {
                        imapc_connection_input_error(conn,
-                               "Banner doesn't begin with OK: %s", name);
+                               "Banner doesn't begin with OK: %s",
+                               t_strcut(t_strndup(data, size), '\n'));
                        return -1;
                }
                conn->input_callback = imapc_connection_input_banner;