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.
This commit is contained in:
Remi Tricot-Le Breton 2021-05-12 17:39:04 +02:00 committed by Christopher Faulet
parent f1800e64ef
commit 208ff01b23
3 changed files with 13 additions and 5 deletions

View File

@ -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)

View File

@ -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;
}
/*

View File

@ -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;
}