From: Stephan Bosch Date: Fri, 16 Feb 2018 22:49:31 +0000 (+0100) Subject: lib-smtp: client: Flush and check output for errors after uncorking. X-Git-Tag: 2.3.9~2276 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=326301f0d478de2d0dd4bf40dda7099ef015ee3e;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: Flush and check output for errors after uncorking. Otherwise, a disconnection event may be missed. --- diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index a59955ca24..3994d13c69 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -194,11 +194,14 @@ void smtp_client_connection_cork(struct smtp_client_connection *conn) void smtp_client_connection_uncork(struct smtp_client_connection *conn) { + conn->corked = FALSE; if (conn->conn.output != NULL) { + if (o_stream_uncork_flush(conn->conn.output) < 0) { + smtp_client_connection_handle_output_error(conn); + return; + } smtp_client_connection_trigger_output(conn); - o_stream_uncork(conn->conn.output); } - conn->corked = FALSE; } enum smtp_client_connection_state @@ -1056,8 +1059,10 @@ static void smtp_client_connection_input(struct connection *_conn) error)); } } - if (conn->conn.output != NULL && !conn->corked) - o_stream_uncork(conn->conn.output); + if (ret >= 0 && conn->conn.output != NULL && !conn->corked) { + if (o_stream_uncork_flush(conn->conn.output) < 0) + smtp_client_connection_handle_output_error(conn); + } smtp_client_connection_unref(&conn); }