From: Aki Tuomi Date: Tue, 4 Jun 2024 08:05:47 +0000 (+0300) Subject: global: Try shutdown connections before closing X-Git-Tag: 2.4.0~1544 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=943a8bebbfa2eb562d0eef48f08e3b1a21bca702;p=thirdparty%2Fdovecot%2Fcore.git global: Try shutdown connections before closing This is to avoid closing connections uncleanly. --- diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index 8e5bfa62f3..f9dbe1d55c 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -513,6 +513,8 @@ static void client_default_destroy(struct client *client, const char *reason) timeout_remove(&client->to_idle_output); timeout_remove(&client->to_idle); + if (!client->hibernated && client->fd_in == client->fd_out) + (void)shutdown(client->fd_out, SHUT_RDWR); /* i/ostreams are already closed at this stage, so fd can be closed */ fd_close_maybe_stdio(&client->fd_in, &client->fd_out); diff --git a/src/lib/connection.c b/src/lib/connection.c index 0271fa134b..fa64ba066c 100644 --- a/src/lib/connection.c +++ b/src/lib/connection.c @@ -892,6 +892,8 @@ void connection_disconnect(struct connection *conn) i_stream_destroy(&conn->input); o_stream_close(conn->output); o_stream_destroy(&conn->output); + if (conn->fd_in == conn->fd_out) + (void)shutdown(conn->fd_out, SHUT_RDWR); fd_close_maybe_stdio(&conn->fd_in, &conn->fd_out); conn->disconnected = TRUE; } diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index 211f7620be..0393bbd0a3 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -417,6 +417,8 @@ void client_disconnect(struct client *client, const char *reason, } i_stream_close(client->input); o_stream_close(client->output); + (void)shutdown(client->fd, SHUT_RDWR); + i_close_fd(&client->fd); if (unref) { i_assert(client->refcount > 1); diff --git a/src/login-common/login-proxy.c b/src/login-common/login-proxy.c index 13a2b767f8..ceccfc632f 100644 --- a/src/login-common/login-proxy.c +++ b/src/login-common/login-proxy.c @@ -576,6 +576,7 @@ static void login_proxy_disconnect(struct login_proxy *proxy) i_stream_destroy(&proxy->server_input); o_stream_destroy(&proxy->server_output); if (proxy->server_fd != -1) { + (void)shutdown(proxy->server_fd, SHUT_RDWR); net_disconnect(proxy->server_fd); proxy->server_fd = -1; } diff --git a/src/pop3/pop3-client.c b/src/pop3/pop3-client.c index d3d40a4321..12f1e9d450 100644 --- a/src/pop3/pop3-client.c +++ b/src/pop3/pop3-client.c @@ -640,6 +640,8 @@ static void client_default_destroy(struct client *client, const char *reason) i_stream_destroy(&client->input); o_stream_destroy(&client->output); + if (client->fd_in == client->fd_out) + (void)shutdown(client->fd_out, SHUT_RDWR); fd_close_maybe_stdio(&client->fd_in, &client->fd_out); /* Autoexpunging might run for a long time. Disconnect the client