From: Aurelien DARRAGON Date: Wed, 9 Apr 2025 19:57:39 +0000 (+0200) Subject: MEDIUM: tree-wide: avoid manually initializing proxies X-Git-Tag: v3.2-dev10~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4194f75;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/cfgparse.c b/src/cfgparse.c index 4fe2da978..b91da359f 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 22e0278e9..77c3ad59b 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 41a178ef8..181e81b91 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 142d7415e..8e4ea48f6 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 3fae7e60b..40bf0f64b 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 40fc0e53c..3abfd2735 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 d97e58056..335ee74e7 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 fa1dadc3c..5f65222d7 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;