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: