From f9ce57e86c9126785a25e5b6625f0f43b17ce210 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 5 Oct 2017 17:24:42 +0200 Subject: [PATCH] MEDIUM: connection: make conn_sock_shutw() aware of lingering Instead of having to manually handle lingering outside, let's make conn_sock_shutw() check for it before calling shutdown(). We simply don't want to emit the FIN if we're going to reset the connection due to lingering. It's particularly important for silent-drop where it's absolutely mandatory that no packet leaves the machine. --- include/proto/connection.h | 3 ++- src/stream_interface.c | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/proto/connection.h b/include/proto/connection.h index 17b68dd9e6..defdefe961 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -432,7 +432,8 @@ static inline void conn_sock_shutw(struct connection *c) { c->flags |= CO_FL_SOCK_WR_SH; __conn_sock_stop_send(c); - if (conn_ctrl_ready(c)) + /* don't perform a clean shutdown if we're going to reset */ + if (conn_ctrl_ready(c) && !fdtab[c->handle.fd].linger_risk) shutdown(c->handle.fd, SHUT_WR); } diff --git a/src/stream_interface.c b/src/stream_interface.c index 28af07e876..7838372dc3 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -861,6 +861,7 @@ static void stream_int_shutw_conn(struct stream_interface *si) else { /* clean data-layer shutdown */ conn_xprt_shutw(conn); + conn_sock_shutw(conn); /* If the stream interface is configured to disable half-open * connections, we'll skip the shutdown(), but only if the @@ -869,9 +870,6 @@ static void stream_int_shutw_conn(struct stream_interface *si) * waiting for the server). */ if (!(si->flags & SI_FL_NOHALF) || !(ic->flags & (CF_SHUTR|CF_DONT_READ))) { - /* We shutdown transport layer */ - conn_sock_shutw(conn); - if (!(ic->flags & (CF_SHUTR|CF_DONT_READ))) { /* OK just a shutw, but we want the caller * to disable polling on this FD if exists. -- 2.39.5