diff --git a/src/proxy.c b/src/proxy.c index 1b4b9367d..326ff3eb6 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -371,6 +371,10 @@ void deinit_proxy(struct proxy *p) while (s) { list_for_each_entry(srvdf, &server_deinit_list, list) srvdf->fct(s); + + if (p->lbprm.server_deinit) + p->lbprm.server_deinit(s); + s = srv_drop(s); }/* end while(s) */ diff --git a/src/server.c b/src/server.c index 6b984029a..8ccb1bc42 100644 --- a/src/server.c +++ b/src/server.c @@ -3113,6 +3113,9 @@ void srv_free_params(struct server *srv) * dynamic servers, its refcount is decremented first. The free operations are * conducted only if the refcount is nul. * + * A general rule is to assume that proxy may already be freed, so cleanup checks + * must not depend on the proxy + * * As a convenience, is returned if srv is not NULL. It may be useful * when calling srv_drop on the list of servers. */ @@ -3156,9 +3159,6 @@ struct server *srv_drop(struct server *srv) EXTRA_COUNTERS_FREE(srv->extra_counters); - if (srv->proxy->lbprm.server_deinit) - srv->proxy->lbprm.server_deinit(srv); - ha_free(&srv); end: