From: Willy Tarreau Date: Thu, 5 Oct 2017 15:24:42 +0000 (+0200) Subject: MEDIUM: connection: make conn_sock_shutw() aware of lingering X-Git-Tag: v1.8-dev3~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f9ce57e;p=thirdparty%2Fhaproxy.git 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. --- 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.