diff --git a/src/haproxy.c b/src/haproxy.c index 6a8c13e6d..215c68a30 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2555,7 +2555,6 @@ static void deinit_act_rules(struct list *rules) list_for_each_entry_safe(rule, ruleb, rules, list) { LIST_DEL(&rule->list); deinit_acl_cond(rule->cond); - release_sample_expr(rule->arg.vars.expr); if (rule->release_ptr) rule->release_ptr(rule); free(rule); diff --git a/src/vars.c b/src/vars.c index b154c529d..fd95eed5d 100644 --- a/src/vars.c +++ b/src/vars.c @@ -689,6 +689,11 @@ static enum act_return action_clear(struct act_rule *rule, struct proxy *px, return ACT_RET_CONT; } +static void release_store_rule(struct act_rule *rule) +{ + release_sample_expr(rule->arg.vars.expr); +} + /* This two function checks the variable name and replace the * configuration string name by the global string name. its * the same string, but the global pointer can be easy to @@ -758,6 +763,7 @@ static enum act_parse_ret parse_store(const char **args, int *arg, struct proxy if (!set_var) { rule->action = ACT_CUSTOM; rule->action_ptr = action_clear; + rule->release_ptr = release_store_rule; return ACT_RET_PRS_OK; } @@ -791,6 +797,7 @@ static enum act_parse_ret parse_store(const char **args, int *arg, struct proxy rule->action = ACT_CUSTOM; rule->action_ptr = action_store; + rule->release_ptr = release_store_rule; return ACT_RET_PRS_OK; }