]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: mux-h2/trace: Fix traces on h2c initialization
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 4 Oct 2019 13:19:43 +0000 (15:19 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 4 Oct 2019 13:46:59 +0000 (15:46 +0200)
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.

src/mux_h2.c

index 2c295fcb5d5be074ec835bdcbbf1737f3e059e9b..34c580d694dc4436f9b57b0eda749843b348b365 100644 (file)
@@ -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;
 }