From: Timo Sirainen Date: Tue, 11 Sep 2012 17:45:38 +0000 (+0300) Subject: imapc: Fixed parsing "text" input after OK/NO/BAD/BYE. X-Git-Tag: 2.1.10~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=002858d28512189f2f02af19e7af76e5eb8470e7;p=thirdparty%2Fdovecot%2Fcore.git imapc: Fixed parsing "text" input after OK/NO/BAD/BYE. --- diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 9fcacc9849..3229dd2b97 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -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;