summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien DARRAGON <adarragon@haproxy.com>2023-05-11 10:30:27 +0200
committerChristopher Faulet <cfaulet@haproxy.com>2023-05-11 15:37:04 +0200
commit7abc9224a69eb5f1b592336044257b38823a8fe3 (patch)
treebcd5474df04ac1b4a23c1ca86ed68467a20b7c2c
parent8dfc2491d2e3a511246f570e0de86c253a86ec54 (diff)
downloadhaproxy-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.h1
-rw-r--r--src/http_rules.c20
-rw-r--r--src/proxy.c15
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) {