From 208ff01b23eda19fe41780310f4d08ca86e28766 Mon Sep 17 00:00:00 2001 From: Remi Tricot-Le Breton Date: Wed, 12 May 2021 17:39:04 +0200 Subject: [PATCH] BUG/MINOR: peers: Missing calloc return value check in peers_register_table A memory allocation failure happening during peers_register_table would have resulted in a crash. This function is only called during init. It was raised in GitHub issue #1233. It could be backported to all stable branches. --- include/haproxy/peers.h | 2 +- src/peers.c | 11 +++++++++-- src/stick_table.c | 5 +++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/haproxy/peers.h b/include/haproxy/peers.h index 636b5c871..d5e5765b2 100644 --- a/include/haproxy/peers.h +++ b/include/haproxy/peers.h @@ -36,7 +36,7 @@ extern struct peers *cfg_peers; int peers_init_sync(struct peers *peers); int peers_alloc_dcache(struct peers *peers); -void peers_register_table(struct peers *, struct stktable *table); +int peers_register_table(struct peers *, struct stktable *table); void peers_setup_frontend(struct proxy *fe); #if defined(USE_OPENSSL) diff --git a/src/peers.c b/src/peers.c index 3f8850843..3a980dd11 100644 --- a/src/peers.c +++ b/src/peers.c @@ -3366,16 +3366,21 @@ int peers_alloc_dcache(struct peers *peers) /* * Function used to register a table for sync on a group of peers - * + * Returns 0 in case of success. */ -void peers_register_table(struct peers *peers, struct stktable *table) +int peers_register_table(struct peers *peers, struct stktable *table) { struct shared_table *st; struct peer * curpeer; int id = 0; + int retval = 0; for (curpeer = peers->remote; curpeer; curpeer = curpeer->next) { st = calloc(1,sizeof(*st)); + if (!st) { + retval = 1; + break; + } st->table = table; st->next = curpeer->tables; if (curpeer->tables) @@ -3393,6 +3398,8 @@ void peers_register_table(struct peers *peers, struct stktable *table) } table->sync_task = peers->sync_task; + + return retval; } /* diff --git a/src/stick_table.c b/src/stick_table.c index 0255cd276..fbfbc4a8c 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -637,6 +637,7 @@ struct task *process_table_expire(struct task *task, void *context, unsigned int /* Perform minimal stick table intializations, report 0 in case of error, 1 if OK. */ int stktable_init(struct stktable *t) { + int peers_retval = 0; if (t->size) { t->keys = EB_ROOT_UNIQUE; memset(&t->exps, 0, sizeof(t->exps)); @@ -654,10 +655,10 @@ int stktable_init(struct stktable *t) t->exp_task->context = (void *)t; } if (t->peers.p && t->peers.p->peers_fe && !t->peers.p->peers_fe->disabled) { - peers_register_table(t->peers.p, t); + peers_retval = peers_register_table(t->peers.p, t); } - return t->pool != NULL; + return (t->pool != NULL) && !peers_retval; } return 1; }