BUG/MINOR: proxy/session: Be sure to have a listener to increment its counters
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 12 Mar 2021 08:16:27 +0000 (09:16 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 12 Mar 2021 12:47:13 +0000 (13:47 +0100)
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.

(cherry picked from commit 77e376783e891fe5dda4fe4e1198cf8dff0b118d)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit d57f8b2b30875e2f5c0c4452a1ec719b9c308041)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit d571a771c3bc35e4d1054b85389bf39a062b26ac)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

include/proto/proxy.h

index 7f108b5..0f0411c 100644 (file)
@@ -114,7 +114,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));
@@ -125,7 +125,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));