]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-doveadm: Fix hang if read() fails from cmd_input
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 May 2022 17:27:33 +0000 (20:27 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 17 May 2022 10:34:24 +0000 (10:34 +0000)
src/lib-doveadm/doveadm-client.c

index ce7c2fac76c48cd07553caa11c10bfd0f24b3be8..a6e9c1856b32c526e8b17e761b4bd82815252adb 100644 (file)
@@ -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)