changeset 22802:b034cb09fbb6

lib-imap-client: continue imapc operation on parsing errors.
author Sergey Kitov <sergey.kitov@open-xchange.com>
date Mon, 05 Feb 2018 13:38:16 +0200
parents 2fdbdfee4d71
children 766e2da35883
files src/lib-imap-client/imapc-connection.c
diffstat 1 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-connection.c	Mon Jan 29 09:55:51 2018 -0500
+++ b/src/lib-imap-client/imapc-connection.c	Mon Feb 05 13:38:16 2018 +0200
@@ -694,8 +694,11 @@
 		return 0;
 	}
 	if (ret < 0) {
-		imapc_connection_input_error(conn, "Error parsing input: %s",
-			imap_parser_get_error(conn->parser, &fatal));
+		const char *err_msg = imap_parser_get_error(conn->parser, &fatal);
+		if (fatal)
+			imapc_connection_input_error(conn, "Error parsing input: %s", err_msg);
+		else
+			i_error("Error parsing input: %s", err_msg);
 		return -1;
 	}
 
@@ -729,6 +732,11 @@
 			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;
 }
@@ -1199,8 +1207,12 @@
 		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;