From 2560cce7c5d7a2f3859173886c3b139dc67eff0b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 11 Jan 2026 15:19:18 +0100 Subject: [PATCH] MINOR: tcp-sample: permit retrieving tcp_info from the connection/session stage The fc_xxx info that are retrieved over tcp_info could currently not be accessed before a stream is created due to a test that verified the existence of a stream. The rationale here was that the function works both for frontend and backend. Let's always retrieve these info from the session for the frontend case so that it now becomes possible to set variables at connection/session time. The doc did not mention this limitation so this could almost be considered as a bug. --- src/tcp_sample.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/tcp_sample.c b/src/tcp_sample.c index 1d414ae4b..64725ef88 100644 --- a/src/tcp_sample.c +++ b/src/tcp_sample.c @@ -323,21 +323,20 @@ static inline int get_tcp_info(const struct arg *args, struct sample *smp, { struct connection *conn; - /* strm can be null. */ - if (!smp->strm) - return 0; - smp->data.type = SMP_T_SINT; - /* get the object associated with the stream connector.The - * object can be other thing than a connection. For example, - * it could be an appctx. + + /* The front connection may be obtained either via the stream or the + * session. Since the session is always there, we use it. Note that + * the origin is not necessarily a connection (e.g. appctx). The back + * connection however only works with a stream, so we check both. */ - conn = (dir == 0 ? sc_conn(smp->strm->scf) : sc_conn(smp->strm->scb)); + conn = dir == 0 ? + objt_conn(smp->sess->origin) : + smp->strm ? sc_conn(smp->strm->scb) : NULL; if (!conn || !conn->ctrl->get_info || !conn->ctrl->get_info(conn, &smp->data.u.sint, val)) return 0; - return 1; }