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:
parent
f1800e64ef
commit
208ff01b23
@ -36,7 +36,7 @@ extern struct peers *cfg_peers;
|
|||||||
|
|
||||||
int peers_init_sync(struct peers *peers);
|
int peers_init_sync(struct peers *peers);
|
||||||
int peers_alloc_dcache(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);
|
void peers_setup_frontend(struct proxy *fe);
|
||||||
|
|
||||||
#if defined(USE_OPENSSL)
|
#if defined(USE_OPENSSL)
|
||||||
|
11
src/peers.c
11
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
|
* 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 shared_table *st;
|
||||||
struct peer * curpeer;
|
struct peer * curpeer;
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
for (curpeer = peers->remote; curpeer; curpeer = curpeer->next) {
|
for (curpeer = peers->remote; curpeer; curpeer = curpeer->next) {
|
||||||
st = calloc(1,sizeof(*st));
|
st = calloc(1,sizeof(*st));
|
||||||
|
if (!st) {
|
||||||
|
retval = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
st->table = table;
|
st->table = table;
|
||||||
st->next = curpeer->tables;
|
st->next = curpeer->tables;
|
||||||
if (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;
|
table->sync_task = peers->sync_task;
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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. */
|
/* Perform minimal stick table intializations, report 0 in case of error, 1 if OK. */
|
||||||
int stktable_init(struct stktable *t)
|
int stktable_init(struct stktable *t)
|
||||||
{
|
{
|
||||||
|
int peers_retval = 0;
|
||||||
if (t->size) {
|
if (t->size) {
|
||||||
t->keys = EB_ROOT_UNIQUE;
|
t->keys = EB_ROOT_UNIQUE;
|
||||||
memset(&t->exps, 0, sizeof(t->exps));
|
memset(&t->exps, 0, sizeof(t->exps));
|
||||||
@ -654,10 +655,10 @@ int stktable_init(struct stktable *t)
|
|||||||
t->exp_task->context = (void *)t;
|
t->exp_task->context = (void *)t;
|
||||||
}
|
}
|
||||||
if (t->peers.p && t->peers.p->peers_fe && !t->peers.p->peers_fe->disabled) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user