From: Timo Sirainen Date: Thu, 5 May 2022 17:27:33 +0000 (+0300) Subject: lib-doveadm: Fix hang if read() fails from cmd_input X-Git-Tag: 2.4.0~4052 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e41601470d2bc36ba76cc714541c09bc2eea3268;p=thirdparty%2Fdovecot%2Fcore.git lib-doveadm: Fix hang if read() fails from cmd_input --- diff --git a/src/lib-doveadm/doveadm-client.c b/src/lib-doveadm/doveadm-client.c index ce7c2fac76..a6e9c1856b 100644 --- a/src/lib-doveadm/doveadm-client.c +++ b/src/lib-doveadm/doveadm-client.c @@ -61,6 +61,7 @@ static bool doveadm_client_input_one(struct doveadm_client *conn); static int doveadm_client_init_ssl(struct doveadm_client *conn, const char **error_r); static void doveadm_client_destroy(struct doveadm_client **_conn); +static void doveadm_client_destroy_conn(struct connection *_conn); void doveadm_client_settings_dup(const struct doveadm_client_settings *src, struct doveadm_client_settings *dest_r, @@ -153,7 +154,11 @@ static void doveadm_client_send_cmd_input(struct doveadm_client *conn) return; conn->cmd_output = o_stream_create_dot(conn->conn.output, TRUE); - (void)doveadm_client_send_cmd_input_more(conn); + if (doveadm_client_send_cmd_input_more(conn) < 0) { + i_assert(conn->to_destroy == NULL); + conn->to_destroy = timeout_add_short(0, + doveadm_client_destroy_conn, &conn->conn); + } } static int doveadm_client_output(struct doveadm_client *conn)