]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: rhttp: initialize session origin after preconnect reversal
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 23 May 2024 13:06:52 +0000 (15:06 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 24 May 2024 12:47:21 +0000 (14:47 +0200)
Since the following commit, session is initialized early for rhttp
preconnect.

  12c40c25a9520fe3365950184fe724a1f4e91d03
  MEDIUM: rhttp: create session for active preconnect

Session origin member was not set. However, this prevents several
session fetches to not work as expected. Worst, this caused a regression
as previously session was created after reversal with origin member
defined. This was reported by user William Manley on the mailing-list
which rely on set-dst.

One possible fix would be to set origin on session_new(). However, as
this is done before reversal, some session members may be incorrectly
initialized, in particular source and destination address.

Thus, session origin is only set after reversal is completed. This
ensures that session fetches have the same behavior on standard
connections and reversable ones.

This does not need to be backported.

src/connection.c
src/proto_rhttp.c

index d186c2f01e5d3f90342ca5d68521160233ca60ee..3fedad9a58ef23724a151b8fa6628f54d52836ab 100644 (file)
@@ -2798,6 +2798,9 @@ int conn_reverse(struct connection *conn)
                conn->target = &l->obj_type;
                conn->flags |= CO_FL_ACT_REVERSING;
                task_wakeup(l->rx.rhttp.task, TASK_WOKEN_RES);
+
+               /* Initialize session origin after reversal. Mandatory for several fetches. */
+               sess->origin = &conn->obj_type;
        }
 
        /* Invert source and destination addresses if already set. */
index 9bf02157c13874666a0e770101eef1a7207ebc4a..a6fc955749a271d5247b5e10866ef597c7be7919 100644 (file)
@@ -62,6 +62,9 @@ static struct connection *new_reverse_conn(struct listener *l, struct server *sr
 
        HA_ATOMIC_INC(&th_ctx->nb_rhttp_conns);
 
+       /* session origin is only set after reversal. This ensures fetches
+        * will be functional only after reversal, in particular src/dst.
+        */
        sess = session_new(l->bind_conf->frontend, l, NULL);
        if (!sess)
                goto err;