From: Aurelien DARRAGON Date: Thu, 11 May 2023 08:30:27 +0000 (+0200) Subject: MINOR: proxy: add http_free_redirect_rule() function X-Git-Tag: v2.8-dev12~60 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7abc9224a69eb5f1b592336044257b38823a8fe3;p=thirdparty%2Fhaproxy.git MINOR: proxy: add http_free_redirect_rule() function Adding http_free_redirect_rule() function to free a single redirect rule since it may be required to free rules outside of free_proxy() function. This patch is required for an upcoming bugfix. [for 2.2, free_proxy function did not exist (first seen in 2.4), thus http_free_redirect_rule() needs to be deducted from haproxy.c deinit() function if the patch is required] --- diff --git a/include/haproxy/http_rules.h b/include/haproxy/http_rules.h index 1820bbd8d5..740b546f2a 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 8e257eae8d..69ad455f48 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 af37b44928..632d23e496 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) {