From: Christopher Faulet Date: Fri, 12 Mar 2021 08:16:27 +0000 (+0100) Subject: BUG/MINOR: proxy/session: Be sure to have a listener to increment its counters X-Git-Tag: v2.4-dev12~50 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=77e376783e891fe5dda4fe4e1198cf8dff0b118d;p=thirdparty%2Fhaproxy.git BUG/MINOR: proxy/session: Be sure to have a listener to increment its counters It is possible to have a session without a listener. It happens for applets on the client side. Thus all accesses to the listener info from the session must be guarded. It was the purpose of the commit 36119de18 ("BUG/MEDIUM: session: NULL dereference possible when accessing the listener"). However, some tests on the session's listener existence are missing in proxy_inc_* functions. This patch should fix the issues #1171, #1172, #1173, #1174 and #1175. It must be backported with the above commit as far as 1.8. --- diff --git a/include/haproxy/proxy.h b/include/haproxy/proxy.h index 4488b69653..69cde1df53 100644 --- a/include/haproxy/proxy.h +++ b/include/haproxy/proxy.h @@ -117,7 +117,7 @@ static inline void proxy_reset_timeouts(struct proxy *proxy) static inline void proxy_inc_fe_conn_ctr(struct listener *l, struct proxy *fe) { _HA_ATOMIC_ADD(&fe->fe_counters.cum_conn, 1); - if (l->counters) + if (l && l->counters) _HA_ATOMIC_ADD(&l->counters->cum_conn, 1); HA_ATOMIC_UPDATE_MAX(&fe->fe_counters.cps_max, update_freq_ctr(&fe->fe_conn_per_sec, 1)); @@ -128,7 +128,7 @@ static inline void proxy_inc_fe_sess_ctr(struct listener *l, struct proxy *fe) { _HA_ATOMIC_ADD(&fe->fe_counters.cum_sess, 1); - if (l->counters) + if (l && l->counters) _HA_ATOMIC_ADD(&l->counters->cum_sess, 1); HA_ATOMIC_UPDATE_MAX(&fe->fe_counters.sps_max, update_freq_ctr(&fe->fe_sess_per_sec, 1)); @@ -146,7 +146,7 @@ static inline void proxy_inc_be_ctr(struct proxy *be) static inline void proxy_inc_fe_req_ctr(struct listener *l, struct proxy *fe) { _HA_ATOMIC_ADD(&fe->fe_counters.p.http.cum_req, 1); - if (l->counters) + if (l && l->counters) _HA_ATOMIC_ADD(&l->counters->p.http.cum_req, 1); HA_ATOMIC_UPDATE_MAX(&fe->fe_counters.p.http.rps_max, update_freq_ctr(&fe->fe_req_per_sec, 1));