From: Willy Tarreau Date: Wed, 18 Oct 2017 13:01:14 +0000 (+0200) Subject: MINOR: session: release the listener with the session, not the stream X-Git-Tag: v1.8-rc1~77 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f0c64cad7a9d3dc0bde92bea671c493c7b284a5;p=thirdparty%2Fhaproxy.git MINOR: session: release the listener with the session, not the stream Since multiple streams can share one session attached to one listener, the listener_release() call must be done in session_free() and not in stream_free(), otherwise we end up with a negative count in H2. --- diff --git a/src/session.c b/src/session.c index 6c7399dd4b..cbc8a5ebdc 100644 --- a/src/session.c +++ b/src/session.c @@ -65,6 +65,8 @@ struct session *session_new(struct proxy *fe, struct listener *li, enum obj_type void session_free(struct session *sess) { HA_ATOMIC_SUB(&sess->fe->feconn, 1); + if (sess->listener) + listener_release(sess->listener); session_store_counters(sess); vars_prune_per_sess(&sess->vars); pool_free2(pool2_session, sess); @@ -361,8 +363,6 @@ static void session_kill_embryonic(struct session *sess) conn_full_close(conn); conn_free(conn); - listener_release(sess->listener); - task_delete(task); task_free(task); session_free(sess); diff --git a/src/stream.c b/src/stream.c index 5a5adb7f8e..b1c2b04f94 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2455,9 +2455,6 @@ struct task *process_stream(struct task *t) if (s->flags & SF_BE_ASSIGNED) HA_ATOMIC_SUB(&s->be->beconn, 1); - if (sess->listener) - listener_release(sess->listener); - if (unlikely((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) { chunk_printf(&trash, "%08x:%s.closed[%04x:%04x]\n",