From 65c570f185241dab38121290540c980151ad2db3 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 6 Jun 2016 02:26:09 +0300 Subject: [PATCH] dict: Fixed hang when pipelining multiple commands. --- src/dict/dict-connection.c | 41 ++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/dict/dict-connection.c b/src/dict/dict-connection.c index 7ab3f1f043..d091eee83e 100644 --- a/src/dict/dict-connection.c +++ b/src/dict/dict-connection.c @@ -108,11 +108,32 @@ static int dict_connection_dict_init(struct dict_connection *conn) return 0; } -static void dict_connection_input(struct dict_connection *conn) +static void dict_connection_input_more(struct dict_connection *conn) { const char *line; int ret; + while ((line = i_stream_next_line(conn->input)) != NULL) { + T_BEGIN { + ret = dict_command_input(conn, line); + } T_END; + if (ret < 0) { + dict_connection_destroy(conn); + break; + } + if (array_count(&conn->cmds) >= DICT_CONN_MAX_PENDING_COMMANDS) { + io_remove(&conn->io); + if (conn->to_input != NULL) + timeout_remove(&conn->to_input); + break; + } + } +} + +static void dict_connection_input(struct dict_connection *conn) +{ + const char *line; + if (conn->to_input != NULL) timeout_remove(&conn->to_input); @@ -147,21 +168,7 @@ static void dict_connection_input(struct dict_connection *conn) } } - while ((line = i_stream_next_line(conn->input)) != NULL) { - T_BEGIN { - ret = dict_command_input(conn, line); - } T_END; - if (ret < 0) { - dict_connection_destroy(conn); - break; - } - if (array_count(&conn->cmds) >= DICT_CONN_MAX_PENDING_COMMANDS) { - io_remove(&conn->io); - if (conn->to_input != NULL) - timeout_remove(&conn->to_input); - break; - } - } + dict_connection_input_more(conn); } void dict_connection_continue_input(struct dict_connection *conn) @@ -171,7 +178,7 @@ void dict_connection_continue_input(struct dict_connection *conn) conn->io = io_add(conn->fd, IO_READ, dict_connection_input, conn); if (conn->to_input == NULL) - conn->to_input = timeout_add_short(0, dict_connection_input, conn); + conn->to_input = timeout_add_short(0, dict_connection_input_more, conn); } static int dict_connection_output(struct dict_connection *conn) -- 2.47.3