diff --git a/include/haproxy/server.h b/include/haproxy/server.h index 4c382fa69..3829bce2b 100644 --- a/include/haproxy/server.h +++ b/include/haproxy/server.h @@ -62,6 +62,7 @@ struct server *cli_find_server(struct appctx *appctx, char *arg); struct server *new_server(struct proxy *proxy); void srv_take(struct server *srv); struct server *srv_drop(struct server *srv); +void srv_free_params(struct server *srv); int srv_init_per_thr(struct server *srv); void srv_set_ssl(struct server *s, int use_ssl); const char *srv_adm_st_chg_cause(enum srv_adm_st_chg_cause cause); diff --git a/src/proxy.c b/src/proxy.c index bc086865c..a15acc13b 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -310,6 +310,11 @@ void free_proxy(struct proxy *p) s = srv_drop(s); }/* end while(s) */ + /* also free default-server parameters since some of them might have + * been dynamically allocated (e.g.: config hints, cookies, ssl..) + */ + srv_free_params(&p->defsrv); + list_for_each_entry_safe(l, l_next, &p->conf.listeners, by_fe) { LIST_DELETE(&l->by_fe); LIST_DELETE(&l->by_bind); diff --git a/src/server.c b/src/server.c index eefb3bccc..1eb13c42e 100644 --- a/src/server.c +++ b/src/server.c @@ -2465,6 +2465,24 @@ void srv_take(struct server *srv) HA_ATOMIC_INC(&srv->refcount); } +/* deallocate common server parameters (may be used by default-servers) */ +void srv_free_params(struct server *srv) +{ + free(srv->cookie); + free(srv->hostname); + free(srv->hostname_dn); + free((char*)srv->conf.file); + free(srv->per_thr); + free(srv->per_tgrp); + free(srv->curr_idle_thr); + free(srv->resolvers_id); + free(srv->addr_node.key); + free(srv->lb_nodes); + + if (xprt_get(XPRT_SSL) && xprt_get(XPRT_SSL)->destroy_srv) + xprt_get(XPRT_SSL)->destroy_srv(srv); +} + /* Deallocate a server and its member. must be allocated. For * dynamic servers, its refcount is decremented first. The free operations are * conducted only if the refcount is nul. @@ -2498,19 +2516,8 @@ struct server *srv_drop(struct server *srv) task_destroy(srv->srvrq_check); free(srv->id); - free(srv->cookie); - free(srv->hostname); - free(srv->hostname_dn); - free((char*)srv->conf.file); - free(srv->per_thr); - free(srv->per_tgrp); - free(srv->curr_idle_thr); - free(srv->resolvers_id); - free(srv->addr_node.key); - free(srv->lb_nodes); + srv_free_params(srv); - if (xprt_get(XPRT_SSL) && xprt_get(XPRT_SSL)->destroy_srv) - xprt_get(XPRT_SSL)->destroy_srv(srv); HA_SPIN_DESTROY(&srv->lock); LIST_DELETE(&srv->global_list);