From: Christopher Faulet Date: Fri, 4 Oct 2019 13:19:43 +0000 (+0200) Subject: BUG/MINOR: mux-h2/trace: Fix traces on h2c initialization X-Git-Tag: v2.1-dev3~149 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f81ef0344ea66701d0b729de17cb061a10e2f1b9;p=thirdparty%2Fhaproxy.git BUG/MINOR: mux-h2/trace: Fix traces on h2c initialization When a new H2 connection is initialized, the connection context is not changed before the end. So, traces emitted during this initialization are buggy, except the last one when no error occurred, because the connection context is not an h2c. To fix the bug, the connection context is saved and set as soon as possible. So, the connection can always safely be used in all traces, except for the very first one. And on error, the connection context is restored. No need to backport. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 2c295fcb5d..34c580d694 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -781,8 +781,9 @@ static int h2_init(struct connection *conn, struct proxy *prx, struct session *s { struct h2c *h2c; struct task *t = NULL; + void *conn_ctx = conn->ctx; - TRACE_ENTER(H2_EV_H2C_NEW, conn); + TRACE_ENTER(H2_EV_H2C_NEW); h2c = pool_alloc(pool_head_h2c); if (!h2c) @@ -854,6 +855,8 @@ static int h2_init(struct connection *conn, struct proxy *prx, struct session *s LIST_INIT(&h2c->sending_list); LIST_INIT(&h2c->buf_wait.list); + conn->ctx = h2c; + if (t) task_queue(t); @@ -861,17 +864,15 @@ static int h2_init(struct connection *conn, struct proxy *prx, struct session *s /* FIXME: this is temporary, for outgoing connections we need * to immediately allocate a stream until the code is modified * so that the caller calls ->attach(). For now the outgoing cs - * is stored as conn->ctx by the caller. + * is stored as conn->ctx by the caller and saved in conn_ctx. */ struct h2s *h2s; - h2s = h2c_bck_stream_new(h2c, conn->ctx, sess); + h2s = h2c_bck_stream_new(h2c, conn_ctx, sess); if (!h2s) goto fail_stream; } - conn->ctx = h2c; - /* prepare to read something */ h2c_restart_reading(h2c, 1); TRACE_LEAVE(H2_EV_H2C_NEW, conn); @@ -884,7 +885,8 @@ static int h2_init(struct connection *conn, struct proxy *prx, struct session *s tasklet_free(h2c->wait_event.tasklet); pool_free(pool_head_h2c, h2c); fail_no_h2c: - TRACE_DEVEL("leaving in error", H2_EV_H2C_NEW|H2_EV_H2C_END|H2_EV_H2C_ERR, conn); + conn->ctx = conn_ctx; /* restore saved ctx */ + TRACE_DEVEL("leaving in error", H2_EV_H2C_NEW|H2_EV_H2C_END|H2_EV_H2C_ERR); return -1; }