From: Frédéric Lécaille Date: Thu, 7 Mar 2019 14:02:52 +0000 (+0100) Subject: BUG/MAJOR: config: Wrong maxconn adjustment. X-Git-Tag: v2.0-dev2~107 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2365fb0c9748b70ceada1094f59180e9e72b6b6b;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/proxy.c b/src/proxy.c index e60b34a218..be810598ab 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) {