diff --git a/src/listener.c b/src/listener.c index 283058ace..20244056f 100644 --- a/src/listener.c +++ b/src/listener.c @@ -617,9 +617,6 @@ void listener_accept(int fd) * error due to a resource shortage, and we must stop the * listener (ret < 0). */ - if (!(l->options & LI_O_UNLIMITED)) - HA_ATOMIC_SUB(&actconn, 1); - HA_ATOMIC_SUB(&l->nbconn, 1); if (ret == 0) /* successful termination */ continue; diff --git a/src/session.c b/src/session.c index ae98c9476..318c17162 100644 --- a/src/session.c +++ b/src/session.c @@ -269,12 +269,16 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr /* error unrolling */ out_free_sess: + /* prevent call to listener_release during session_free. It will be + * done below, for all errors. */ + sess->listener = NULL; session_free(sess); out_free_conn: conn_stop_tracking(cli_conn); conn_xprt_close(cli_conn); conn_free(cli_conn); out_close: + listener_release(l); if (ret < 0 && l->bind_conf->xprt == xprt_get(XPRT_RAW) && p->mode == PR_MODE_HTTP) { /* critical error, no more memory, try to emit a 500 response */ struct chunk *err_msg = &p->errmsg[HTTP_ERR_500];