From: Stephan Bosch Date: Fri, 16 Feb 2018 09:05:26 +0000 (+0100) Subject: lib-smtp: server: Flush and check output for errors after uncorking. X-Git-Tag: 2.3.9~2280 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be6741282be725d76462110e1d7024956e2a100b;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: server: Flush and check output for errors after uncorking. Otherwise, a disconnection event may be missed. --- diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 6db65a51d5..c6e8a0af7a 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -683,11 +683,14 @@ void smtp_server_connection_cork(struct smtp_server_connection *conn) void smtp_server_connection_uncork(struct smtp_server_connection *conn) { + conn->corked = FALSE; if (conn->conn.output != NULL) { - o_stream_uncork(conn->conn.output); + if (o_stream_uncork_flush(conn->conn.output) < 0) { + smtp_server_connection_handle_output_error(conn); + return; + } smtp_server_connection_trigger_output(conn); } - conn->corked = FALSE; } static void @@ -730,8 +733,10 @@ smtp_server_connection_output(struct smtp_server_connection *conn) smtp_server_connection_timeout_reset(conn); smtp_server_connection_send_replies(conn); } - if (!conn->corked && conn->conn.output != NULL) - o_stream_uncork(conn->conn.output); + if (ret >= 0 && !conn->corked && conn->conn.output != NULL) { + if ((ret=o_stream_uncork_flush(conn->conn.output)) < 0) + smtp_server_connection_handle_output_error(conn); + } smtp_server_connection_unref(&conn); return ret; }