diff options
author | Aurelien DARRAGON <adarragon@haproxy.com> | 2023-05-11 10:30:27 +0200 |
---|---|---|
committer | Christopher Faulet <cfaulet@haproxy.com> | 2023-05-11 15:37:04 +0200 |
commit | 7abc9224a69eb5f1b592336044257b38823a8fe3 (patch) | |
tree | bcd5474df04ac1b4a23c1ca86ed68467a20b7c2c | |
parent | 8dfc2491d2e3a511246f570e0de86c253a86ec54 (diff) | |
download | haproxy-7abc9224a69eb5f1b592336044257b38823a8fe3.tar.gz |
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]
-rw-r--r-- | include/haproxy/http_rules.h | 1 | ||||
-rw-r--r-- | src/http_rules.c | 20 | ||||
-rw-r--r-- | src/proxy.c | 15 |
3 files changed, 23 insertions, 13 deletions
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 <err> filled with the error message. If <use_fmt> is not null, builds a * dynamic log-format rule instead of a static string. Parameter <dir> 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 <haproxy/http_ana.h> #include <haproxy/http_htx.h> #include <haproxy/http_ext.h> +#include <haproxy/http_rules.h> #include <haproxy/listener.h> #include <haproxy/log.h> #include <haproxy/obj_type-t.h> @@ -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) { |