MINOR: session: don't always assume there's a listener
For outgoing connections initiated from an applet, there might not be
any listener. It's the case with peers, which resort to a hack consisting
in making the session's listener point to the peer. This listener is only
used for statistics now so it's much easier to check for its presence now.
diff --git a/src/session.c b/src/session.c
index 7eeb6aa..a8f68a2 100644
--- a/src/session.c
+++ b/src/session.c
@@ -689,7 +689,7 @@
if (objt_server(s->target))
objt_server(s->target)->counters.bytes_in += bytes;
- if (s->listener->counters)
+ if (s->listener && s->listener->counters)
s->listener->counters->bytes_in += bytes;
for (i = 0; i < MAX_SESS_STKCTR; i++) {
@@ -723,7 +723,7 @@
if (objt_server(s->target))
objt_server(s->target)->counters.bytes_out += bytes;
- if (s->listener->counters)
+ if (s->listener && s->listener->counters)
s->listener->counters->bytes_out += bytes;
for (i = 0; i < MAX_SESS_STKCTR; i++) {
@@ -2447,20 +2447,22 @@
s->fe->feconn--;
if (s->flags & SN_BE_ASSIGNED)
s->be->beconn--;
- if (!(s->listener->options & LI_O_UNLIMITED))
- actconn--;
jobs--;
- s->listener->nbconn--;
- if (s->listener->state == LI_FULL)
- resume_listener(s->listener);
+ if (s->listener) {
+ if (!(s->listener->options & LI_O_UNLIMITED))
+ actconn--;
+ s->listener->nbconn--;
+ if (s->listener->state == LI_FULL)
+ resume_listener(s->listener);
- /* Dequeues all of the listeners waiting for a resource */
- if (!LIST_ISEMPTY(&global_listener_queue))
- dequeue_all_listeners(&global_listener_queue);
+ /* Dequeues all of the listeners waiting for a resource */
+ if (!LIST_ISEMPTY(&global_listener_queue))
+ dequeue_all_listeners(&global_listener_queue);
- if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
- (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
- dequeue_all_listeners(&s->fe->listener_queue);
+ if (!LIST_ISEMPTY(&s->fe->listener_queue) &&
+ (!s->fe->fe_sps_lim || freq_ctr_remain(&s->fe->fe_sess_per_sec, s->fe->fe_sps_lim, 0) > 0))
+ dequeue_all_listeners(&s->fe->listener_queue);
+ }
if (unlikely((global.mode & MODE_DEBUG) &&
(!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {