]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: Flush and check output for errors after uncorking.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Fri, 16 Feb 2018 09:05:26 +0000 (10:05 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 17 Feb 2018 14:40:25 +0000 (15:40 +0100)
Otherwise, a disconnection event may be missed.

src/lib-smtp/smtp-server-connection.c

index 6db65a51d5bb83b6777815f71a0b07e6741d0601..c6e8a0af7a8f8a4932408b1e62a99547268df6bb 100644 (file)
@@ -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;
 }