From 96ddc8ab43bfbf9a317041e5d13168ea1c8edfc0 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 19 Oct 2020 16:49:29 +0200 Subject: [PATCH] BUG/MEDIUM: connection: Never cleanup server lists when freeing private conns When a connection is released, depending on its state, it may be detached from the session and it may be removed from the server lists. The first case may happen for private or unsharable active connections. The second one should only be performed for idle or available connections. We never try to remove a connection from the server list if it is attached to a session. But it is also important to never try to remove a private connecion from the server lists, even if it is not attached to a session. Otherwise, the curr_used_conn server counter is decremented once too often. This bug was introduced by the commit 04a24c5ea ("MINOR: connection: don't check priv flag on free"). It is related to the issue #881. It only affects the 2.3, no backport is needed. --- include/haproxy/connection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/haproxy/connection.h b/include/haproxy/connection.h index b735a6e2f..9b89d6e42 100644 --- a/include/haproxy/connection.h +++ b/include/haproxy/connection.h @@ -473,7 +473,7 @@ static inline void conn_free(struct connection *conn) if (LIST_ADDED(&conn->session_list)) { session_unown_conn(conn->owner, conn); } - else { + else if (!(conn->flags & CO_FL_PRIVATE)) { if (obj_type(conn->target) == OBJ_TYPE_SERVER) srv_del_conn_from_list(__objt_server(conn->target), conn); }