From: Sergey Kitov Date: Mon, 8 Jan 2018 09:38:37 +0000 (+0200) Subject: lib-imap-client: continue imapc operation on parsing errors. X-Git-Tag: 2.3.9~2425 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c211cfd6adff5131929ae23b157f7ea5f0d2cd9c;p=thirdparty%2Fdovecot%2Fcore.git lib-imap-client: continue imapc operation on parsing errors. --- diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index 3f1ebc15e8..94ba96d56b 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -684,8 +684,12 @@ imapc_connection_read_line_more(struct imapc_connection *conn, return 0; } if (ret < 0) { - imapc_connection_input_error(conn, "Error parsing input: %s", - imap_parser_get_error(conn->parser, NULL)); + enum imap_parser_error parser_error; + const char *err_msg = imap_parser_get_error(conn->parser, &parser_error); + if (parser_error != IMAP_PARSE_ERROR_BAD_SYNTAX) + imapc_connection_input_error(conn, "Error parsing input: %s", err_msg); + else + i_error("Error parsing input: %s", err_msg); return -1; } @@ -719,6 +723,11 @@ imapc_connection_read_line(struct imapc_connection *conn, i_stream_skip(conn->input, 1); else i_panic("imapc: Missing LF from input line"); + } else if (ret < 0) { + data = i_stream_get_data(conn->input, &size); + unsigned char *lf = memchr(data, '\n', size); + if (lf != NULL) + i_stream_skip(conn->input, (lf - data) + 1); } return ret; } @@ -1210,8 +1219,12 @@ static int imapc_connection_input_untagged(struct imapc_connection *conn) return 1; } - if ((ret = imapc_connection_read_line(conn, &imap_args)) <= 0) - return ret; + if ((ret = imapc_connection_read_line(conn, &imap_args)) == 0) + return 0; + else if (ret < 0) { + imapc_connection_input_reset(conn); + return 1; + } if (!imap_arg_get_atom(&imap_args[0], &name)) { imapc_connection_input_error(conn, "Invalid untagged reply"); return -1;