mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
BUG/MINOR: check: fix leak on add dynamic server with agent-check error
If an error occured during a dynamic server creation, free_check is used to liberate a possible agent-check. However, this does not free associated vars and rules associated as this is done on another function named deinit_srv_agent_check. To simplify the check free and avoid a leak, move free vars/rules in free_check. This is valid because deinit_srv_agent_check also uses free_check. This operation is done only for an agent-check because for a health check, the proxy instance is the owner of check vars/rules. This should not be backported, unless dynamic server checks are backported.
This commit is contained in:
parent
25fe1033cb
commit
6d7fc446b4
17
src/check.c
17
src/check.c
@ -1337,11 +1337,19 @@ const char *init_check(struct check *check, int type)
|
|||||||
|
|
||||||
/* Liberates the resources allocated for a check.
|
/* Liberates the resources allocated for a check.
|
||||||
*
|
*
|
||||||
* This function must only be used at startup when it is known that the check
|
* This function must only be run by the thread owning the check.
|
||||||
* has never been executed.
|
|
||||||
*/
|
*/
|
||||||
void free_check(struct check *check)
|
void free_check(struct check *check)
|
||||||
{
|
{
|
||||||
|
/* For agent-check, free the rules / vars from the server. This is not
|
||||||
|
* done for health-check : the proxy is the owner of the rules / vars
|
||||||
|
* in this case.
|
||||||
|
*/
|
||||||
|
if (check->state & CHK_ST_AGENT) {
|
||||||
|
free_tcpcheck_vars(&check->tcpcheck_rules->preset_vars);
|
||||||
|
ha_free(&check->tcpcheck_rules);
|
||||||
|
}
|
||||||
|
|
||||||
task_destroy(check->task);
|
task_destroy(check->task);
|
||||||
if (check->wait_list.tasklet)
|
if (check->wait_list.tasklet)
|
||||||
tasklet_free(check->wait_list.tasklet);
|
tasklet_free(check->wait_list.tasklet);
|
||||||
@ -1763,11 +1771,6 @@ static void deinit_srv_check(struct server *srv)
|
|||||||
|
|
||||||
static void deinit_srv_agent_check(struct server *srv)
|
static void deinit_srv_agent_check(struct server *srv)
|
||||||
{
|
{
|
||||||
if (srv->agent.tcpcheck_rules) {
|
|
||||||
free_tcpcheck_vars(&srv->agent.tcpcheck_rules->preset_vars);
|
|
||||||
ha_free(&srv->agent.tcpcheck_rules);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (srv->agent.state & CHK_ST_CONFIGURED)
|
if (srv->agent.state & CHK_ST_CONFIGURED)
|
||||||
free_check(&srv->agent);
|
free_check(&srv->agent);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user