From 2365fb0c9748b70ceada1094f59180e9e72b6b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Thu, 7 Mar 2019 15:02:52 +0100 Subject: [PATCH] BUG/MAJOR: config: Wrong maxconn adjustment. Before c8d5b95 the "maxconn" of the backend of dynamic "use_backend" rules was not modified (this does not make sense and this is correct). When implementing proxy_adjust_all_maxconn(), c8d5b95 commit missed this case. With this patch we adjust the "maxconn" of the backend of such rules only if they are not dynamic. Without this patch reg-tests/http-rules/h00003.vtc could make haproxy crash. --- src/proxy.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/proxy.c b/src/proxy.c index e60b34a21..be810598a 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1521,9 +1521,14 @@ void proxy_adjust_all_maxconn() * the same backend or to the default backend. */ if (swrule1->be.backend != curproxy->defbe.be) { + /* note: swrule1->be.backend isn't a backend if the rule + * is dynamic, it's an expression instead, so it must not + * be dereferenced as a backend before being certain it is. + */ list_for_each_entry(swrule2, &curproxy->switching_rules, list) { if (swrule2 == swrule1) { - swrule1->be.backend->tot_fe_maxconn += curproxy->maxconn; + if (!swrule1->dynamic) + swrule1->be.backend->tot_fe_maxconn += curproxy->maxconn; break; } else if (!swrule2->dynamic && swrule2->be.backend == swrule1->be.backend) {