diff --git a/include/haproxy/http_rules.h b/include/haproxy/http_rules.h index 1820bbd8d..740b546f2 100644 --- a/include/haproxy/http_rules.h +++ b/include/haproxy/http_rules.h @@ -34,6 +34,7 @@ extern struct action_kw_list http_after_res_keywords; struct act_rule *parse_http_req_cond(const char **args, const char *file, int linenum, struct proxy *proxy); struct act_rule *parse_http_res_cond(const char **args, const char *file, int linenum, struct proxy *proxy); struct act_rule *parse_http_after_res_cond(const char **args, const char *file, int linenum, struct proxy *proxy); +void http_free_redirect_rule(struct redirect_rule *rdr); struct redirect_rule *http_parse_redirect_rule(const char *file, int linenum, struct proxy *curproxy, const char **args, char **errmsg, int use_fmt, int dir); diff --git a/src/http_rules.c b/src/http_rules.c index 8e257eae8..69ad455f4 100644 --- a/src/http_rules.c +++ b/src/http_rules.c @@ -317,6 +317,26 @@ struct act_rule *parse_http_after_res_cond(const char **args, const char *file, return NULL; } +/* completely free redirect rule */ +void http_free_redirect_rule(struct redirect_rule *rdr) +{ + struct logformat_node *lf, *lfb; + + if (rdr->cond) { + prune_acl_cond(rdr->cond); + free(rdr->cond); + } + free(rdr->rdr_str); + free(rdr->cookie_str); + list_for_each_entry_safe(lf, lfb, &rdr->rdr_fmt, list) { + LIST_DELETE(&lf->list); + release_sample_expr(lf->expr); + free(lf->arg); + free(lf); + } + free(rdr); +} + /* Parses a redirect rule. Returns the redirect rule on success or NULL on error, * with filled with the error message. If is not null, builds a * dynamic log-format rule instead of a static string. Parameter indicates diff --git a/src/proxy.c b/src/proxy.c index af37b4492..632d23e49 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -238,19 +239,7 @@ void free_proxy(struct proxy *p) list_for_each_entry_safe(rdr, rdrb, &p->redirect_rules, list) { LIST_DELETE(&rdr->list); - if (rdr->cond) { - prune_acl_cond(rdr->cond); - free(rdr->cond); - } - free(rdr->rdr_str); - free(rdr->cookie_str); - list_for_each_entry_safe(lf, lfb, &rdr->rdr_fmt, list) { - LIST_DELETE(&lf->list); - release_sample_expr(lf->expr); - free(lf->arg); - free(lf); - } - free(rdr); + http_free_redirect_rule(rdr); } list_for_each_entry_safe(log, logb, &p->logsrvs, list) {