]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: continue imapc operation on parsing errors.
authorSergey Kitov <sergey.kitov@open-xchange.com>
Mon, 8 Jan 2018 09:38:37 +0000 (11:38 +0200)
committerSergey Kitov <sergey.kitov@open-xchange.com>
Fri, 26 Jan 2018 13:55:08 +0000 (15:55 +0200)
src/lib-imap-client/imapc-connection.c

index 3f1ebc15e88bfae6b1c6fccc8a4e6fafdd6cf8f8..94ba96d56bdcb0d88309d747c42ac715b7b5b9bc 100644 (file)
@@ -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;