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.
diff --git a/src/checks.c b/src/checks.c
index 6374720..eaf84a2 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -1564,25 +1564,23 @@
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);