From 4194f756de09b859b85129481448b499aa95b021 Mon Sep 17 00:00:00 2001 From: Aurelien DARRAGON Date: Wed, 9 Apr 2025 21:57:39 +0200 Subject: [PATCH] MEDIUM: tree-wide: avoid manually initializing proxies In this patch we try to use the proxy API init functions as much as possible to avoid code redundancy and prevent proxy initialization errors. As such, we prefer using alloc_new_proxy() and setup_new_proxy() instead of manually allocating the proxy pointer and performing the base init ourselves. --- src/cfgparse.c | 7 ++++--- src/check.c | 9 ++++----- src/cli.c | 11 +++++------ src/flt_spoe.c | 9 +++++---- src/log.c | 7 ++----- src/peers.c | 2 -- src/resolvers.c | 18 +++++------------- src/sink.c | 10 ++-------- 8 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/cfgparse.c b/src/cfgparse.c index 4fe2da9786..b91da359fc 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -556,19 +556,20 @@ static int init_peers_frontend(const char *file, int linenum, const char *id, struct peers *peers) { struct proxy *p; + char *errmsg = NULL; if (peers->peers_fe) { p = peers->peers_fe; goto out; } - p = calloc(1, sizeof *p); + p = alloc_new_proxy(NULL, PR_CAP_FE | PR_CAP_BE, &errmsg); if (!p) { - ha_alert("parsing [%s:%d] : out of memory.\n", file, linenum); + ha_alert("parsing [%s:%d] : %s\n", file, linenum, errmsg); + ha_free(&errmsg); return -1; } - init_new_proxy(p); peers_setup_frontend(p); p->parent = peers; /* Finally store this frontend. */ diff --git a/src/check.c b/src/check.c index 22e0278e91..77c3ad59b5 100644 --- a/src/check.c +++ b/src/check.c @@ -1664,16 +1664,15 @@ static int start_checks() struct proxy *px; struct server *s; + char *errmsg = NULL; int nbcheck=0, mininter=0, srvpos=0; /* 0- init the dummy frontend used to create all checks sessions */ - init_new_proxy(&checks_fe); - checks_fe.id = strdup("CHECKS-FE"); - if (!checks_fe.id) { - ha_alert("Out of memory creating the checks frontend.\n"); + if (!setup_new_proxy(&checks_fe, "CHECKS-FE", PR_CAP_FE | PR_CAP_BE | PR_CAP_INT, &errmsg)) { + ha_alert("error during checks frontend creation: %s\n", errmsg); + ha_free(&errmsg); return ERR_ALERT | ERR_FATAL; } - checks_fe.cap = PR_CAP_FE | PR_CAP_BE | PR_CAP_INT; checks_fe.mode = PR_MODE_TCP; checks_fe.maxconn = 0; checks_fe.conn_retries = CONN_RETRIES; diff --git a/src/cli.c b/src/cli.c index 41a178ef88..181e81b910 100644 --- a/src/cli.c +++ b/src/cli.c @@ -448,17 +448,16 @@ void cli_list_keywords(void) static struct proxy *cli_alloc_fe(const char *name, const char *file, int line) { struct proxy *fe; + char *errmsg = NULL; - fe = calloc(1, sizeof(*fe)); - if (!fe) + fe = alloc_new_proxy("GLOBAL", PR_CAP_FE|PR_CAP_INT, &errmsg); + if (!fe) { + ha_free(&errmsg); // ignored return NULL; + } - init_new_proxy(fe); fe->next = proxies_list; proxies_list = fe; - fe->fe_counters.last_change = ns_to_sec(now_ns); - fe->id = strdup("GLOBAL"); - fe->cap = PR_CAP_FE|PR_CAP_INT; fe->maxconn = 10; /* default to 10 concurrent connections */ fe->timeout.client = MS_TO_TICKS(10000); /* default timeout of 10 seconds */ fe->conf.file = copy_file_name(file); diff --git a/src/flt_spoe.c b/src/flt_spoe.c index 142d7415e9..8e4ea48f6d 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -1204,8 +1204,6 @@ static int spoe_init(struct proxy *px, struct flt_conf *fconf) /* conf->agent->fe was already initialized during the config * parsing. Finish initialization. */ - conf->agent->fe.fe_counters.last_change = ns_to_sec(now_ns); - conf->agent->fe.cap = PR_CAP_FE | PR_CAP_INT; conf->agent->fe.mode = PR_MODE_SPOP; conf->agent->fe.maxconn = 0; conf->agent->fe.options2 |= PR_O2_INDEPSTR; @@ -2541,8 +2539,11 @@ static int parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, /* Start agent's proxy initialization here. It will be finished during * the filter init. */ memset(&conf->agent->fe, 0, sizeof(conf->agent->fe)); - init_new_proxy(&conf->agent->fe); - conf->agent->fe.id = conf->agent->id; + if (!setup_new_proxy(&conf->agent->fe, conf->agent->id, PR_CAP_FE | PR_CAP_INT, err)) { + memprintf(err, "SPOE agent '%s': %s", + curagent->id, *err); + goto error; + } conf->agent->fe.parent = conf->agent; conf->agent->fe.options |= curpxopts; conf->agent->fe.options2 |= curpxopts2; diff --git a/src/log.c b/src/log.c index 3fae7e60ba..40bf0f64bb 100644 --- a/src/log.c +++ b/src/log.c @@ -6060,25 +6060,22 @@ int cfg_parse_log_forward(const char *file, int linenum, char **args, int kwm) err_code |= ERR_WARN; } - px = calloc(1, sizeof *px); + px = alloc_new_proxy(args[1], PR_CAP_FE, &errmsg); if (!px) { + ha_alert("Parsing [%s:%d]: %s\n", file, linenum, errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; } - init_new_proxy(px); px->next = cfg_log_forward; cfg_log_forward = px; px->conf.file = copy_file_name(file); px->conf.line = linenum; px->mode = PR_MODE_SYSLOG; - px->fe_counters.last_change = ns_to_sec(now_ns); - px->cap = PR_CAP_FE; px->maxconn = 10; px->timeout.client = TICK_ETERNITY; px->accept = frontend_accept; px->default_target = &syslog_applet.obj_type; - px->id = strdup(args[1]); px->options3 |= PR_O3_LOGF_HOST_FILL; } else if (strcmp(args[0], "maxconn") == 0) { /* maxconn */ diff --git a/src/peers.c b/src/peers.c index 40fc0e53c8..3abfd2735f 100644 --- a/src/peers.c +++ b/src/peers.c @@ -3235,8 +3235,6 @@ static void peer_session_forceshutdown(struct peer *peer) /* Pre-configures a peers frontend to accept incoming connections */ void peers_setup_frontend(struct proxy *fe) { - fe->fe_counters.last_change = ns_to_sec(now_ns); - fe->cap = PR_CAP_FE | PR_CAP_BE; fe->mode = PR_MODE_PEERS; fe->maxconn = 0; fe->conn_retries = CONN_RETRIES; diff --git a/src/resolvers.c b/src/resolvers.c index d97e580561..335ee74e70 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -3327,8 +3327,6 @@ int check_action_do_resolve(struct act_rule *rule, struct proxy *px, char **err) void resolvers_setup_proxy(struct proxy *px) { - px->fe_counters.last_change = px->be_counters.last_change = ns_to_sec(now_ns); - px->cap = PR_CAP_FE | PR_CAP_BE; px->maxconn = 0; px->conn_retries = 1; px->timeout.server = TICK_ETERNITY; @@ -3478,6 +3476,7 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha { struct resolvers *r = NULL; struct proxy *p = NULL; + char *errmsg = NULL; int err_code = 0; if ((r = calloc(1, sizeof(*r))) == NULL) { @@ -3486,20 +3485,15 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha } /* allocate new proxy to tcp servers */ - p = calloc(1, sizeof *p); + p = alloc_new_proxy(id, PR_CAP_FE | PR_CAP_BE, &errmsg); if (!p) { + ha_free(&errmsg); // ignored err_code |= ERR_ALERT | ERR_FATAL; goto err_free_r; } - init_new_proxy(p); resolvers_setup_proxy(p); p->parent = r; - p->id = strdup(id); - if (!p->id) { - err_code |= ERR_ALERT | ERR_FATAL; - goto err_free_p; - } p->conf.args.file = p->conf.file = copy_file_name(file); p->conf.args.line = p->conf.line = linenum; r->px = p; @@ -3509,7 +3503,7 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha r->conf.file = strdup(file); if (!r->conf.file) { err_code |= ERR_ALERT | ERR_FATAL; - goto err_free_p_id; + goto err_free_p; } r->conf.line = linenum; r->id = strdup(id); @@ -3545,10 +3539,8 @@ out: /* free all allocated stuff and return err_code */ err_free_conf_file: ha_free((void **)&r->conf.file); -err_free_p_id: - ha_free(&p->id); err_free_p: - ha_free(&p); + free_proxy(p); err_free_r: ha_free(&r); return err_code; diff --git a/src/sink.c b/src/sink.c index fa1dadc3c5..5f65222d72 100644 --- a/src/sink.c +++ b/src/sink.c @@ -400,8 +400,6 @@ static int cli_parse_show_events(char **args, char *payload, struct appctx *appc /* Pre-configures a ring proxy to emit connections */ void sink_setup_proxy(struct proxy *px) { - px->be_counters.last_change = ns_to_sec(now_ns); - px->cap = PR_CAP_BE; px->maxconn = 0; px->conn_retries = 1; px->timeout.server = TICK_ETERNITY; @@ -828,15 +826,11 @@ static struct sink *sink_new_ringbuf(const char *id, const char *description, struct proxy *p = NULL; // forward_px /* allocate new proxy to handle forwards */ - p = calloc(1, sizeof(*p)); - if (!p) { - memprintf(err_msg, "out of memory"); + p = alloc_new_proxy(id, PR_CAP_BE, err_msg); + if (!p) goto err; - } - init_new_proxy(p); sink_setup_proxy(p); - p->id = strdup(id); p->conf.args.file = p->conf.file = copy_file_name(file); p->conf.args.line = p->conf.line = linenum; -- 2.39.5