From 38b4d2eb22fec0f11af50f8a9977ccae0e7c66c6 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 Nov 2020 17:08:15 +0100 Subject: [PATCH] CLEANUP: connection: do not use conn->owner when the session is known At a few places we used to rely on conn->owner to retrieve the session while the session is already known. This is not correct because at some of these points the reason the connection's owner was still the session (instead of NULL) is a mistake. At one place a comparison is even made between the session and conn->owner assuming it's valid without checking if it's NULL. Let's clean this up to use the session all the time. Note that this will be needed for a forthcoming fix and will have to be backported. --- include/haproxy/session.h | 2 +- src/backend.c | 4 ++-- src/connection.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/haproxy/session.h b/include/haproxy/session.h index 6a24d8a59..8174a2ae7 100644 --- a/include/haproxy/session.h +++ b/include/haproxy/session.h @@ -103,7 +103,7 @@ static inline int session_add_conn(struct session *sess, struct connection *conn int found = 0; /* Already attach to the session or not the connection owner */ - if (!LIST_ISEMPTY(&conn->session_list) || conn->owner != sess) + if (!LIST_ISEMPTY(&conn->session_list) || (conn->owner && conn->owner != sess)) return 1; list_for_each_entry(srv_list, &sess->srv_list, srv_list) { diff --git a/src/backend.c b/src/backend.c index e0f7dd627..a76f08ce2 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1207,7 +1207,7 @@ static struct connection *conn_backend_get(struct stream *s, struct server *srv, /* attach the connection to the session private list */ conn->owner = s->sess; - session_add_conn(conn->owner, conn, conn->target); + session_add_conn(s->sess, conn, conn->target); } else { LIST_ADDQ(&srv->available_conns[tid], mt_list_to_list(&conn->list)); @@ -1563,7 +1563,7 @@ int connect_server(struct stream *s) ((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_SAFE && srv_conn->mux->flags & MX_FL_HOL_RISK)) { /* If it fail now, the same will be done in mux->detach() callback */ - session_add_conn(srv_conn->owner, srv_conn, srv_conn->target); + session_add_conn(s->sess, srv_conn, srv_conn->target); } } diff --git a/src/connection.c b/src/connection.c index dc54b9d63..366bb25b5 100644 --- a/src/connection.c +++ b/src/connection.c @@ -54,10 +54,10 @@ int conn_create_mux(struct connection *conn) goto fail; if (sess && obj_type(sess->origin) == OBJ_TYPE_CHECK) { - if (conn_install_mux_chk(conn, conn->ctx, conn->owner) < 0) + if (conn_install_mux_chk(conn, conn->ctx, sess) < 0) goto fail; } - else if (conn_install_mux_be(conn, conn->ctx, conn->owner) < 0) + else if (conn_install_mux_be(conn, conn->ctx, sess) < 0) goto fail; srv = objt_server(conn->target); @@ -72,7 +72,7 @@ int conn_create_mux(struct connection *conn) LIST_ADDQ(&srv->available_conns[tid], mt_list_to_list(&conn->list)); else if (conn->flags & CO_FL_PRIVATE) { /* If it fail now, the same will be done in mux->detach() callback */ - session_add_conn(conn->owner, conn, conn->target); + session_add_conn(sess, conn, conn->target); } return 0; fail: