From 6377a0004fa25cc58a0e338a13012d3cf9416ef7 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 1 Dec 2017 22:04:05 +0100 Subject: [PATCH] BUG/MEDIUM: checks: Be sure we have a mux if we created a cs. In connect_conn_chk(), there were one case we could return with a new conn_stream created, but no mux attached. With no mux, cs_destroy() would segfault. Fix that by setting the mux before we can fail. This should be backported to 1.8. --- src/checks.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/checks.c b/src/checks.c index 63747201e..eaf84a225 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1564,25 +1564,23 @@ static int connect_conn_chk(struct task *t) conn->addr.to = s->addr; } + proto = protocol_by_family(conn->addr.to.ss_family); + + conn_prepare(conn, proto, check->xprt); + conn_install_mux(conn, &mux_pt_ops, cs); + cs_attach(cs, check, &check_conn_cb); + conn->target = &s->obj_type; + if ((conn->addr.to.ss_family == AF_INET) || (conn->addr.to.ss_family == AF_INET6)) { int i = 0; i = srv_check_healthcheck_port(check); - if (i == 0) { - cs->data = check; + if (i == 0) return SF_ERR_CHK_PORT; - } set_host_port(&conn->addr.to, i); } - proto = protocol_by_family(conn->addr.to.ss_family); - - conn_prepare(conn, proto, check->xprt); - conn_install_mux(conn, &mux_pt_ops, cs); - cs_attach(cs, check, &check_conn_cb); - conn->target = &s->obj_type; - /* no client address */ clear_addr(&conn->addr.from); -- 2.47.3