BUILD: peers: check allocation error during peers_init_sync()

peers_init_sync() doesn't check task_new()'s return value and doesn't
return any result to indicate success or failure. Let's make it return
an int and check it from the caller.

This can be backported as far as 1.6.
This commit is contained in:
Willy Tarreau 2018-10-15 11:18:03 +02:00
parent 848522f05d
commit d944344f01
3 changed files with 13 additions and 4 deletions

View File

@ -28,7 +28,7 @@
#include <types/stream.h>
#include <types/peers.h>
void peers_init_sync(struct peers *peers);
int peers_init_sync(struct peers *peers);
void peers_register_table(struct peers *, struct stktable *table);
void peers_setup_frontend(struct proxy *fe);

View File

@ -9085,7 +9085,12 @@ out_uri_auth_compat:
curpeers->peers_fe = NULL;
}
else {
peers_init_sync(curpeers);
if (!peers_init_sync(curpeers)) {
ha_alert("Peers section '%s': out of memory, giving up on peers.\n",
curpeers->id);
cfgerr++;
break;
}
last = &curpeers->next;
continue;
}

View File

@ -2202,9 +2202,9 @@ static struct task *process_peer_sync(struct task * task, void *context, unsigne
/*
*
* returns 0 in case of error.
*/
void peers_init_sync(struct peers *peers)
int peers_init_sync(struct peers *peers)
{
struct peer * curpeer;
struct listener *listener;
@ -2216,10 +2216,14 @@ void peers_init_sync(struct peers *peers)
list_for_each_entry(listener, &peers->peers_fe->conf.listeners, by_fe)
listener->maxconn = peers->peers_fe->maxconn;
peers->sync_task = task_new(MAX_THREADS_MASK);
if (!peers->sync_task)
return 0;
peers->sync_task->process = process_peer_sync;
peers->sync_task->context = (void *)peers;
peers->sighandler = signal_register_task(0, peers->sync_task, 0);
task_wakeup(peers->sync_task, TASK_WOKEN_INIT);
return 1;
}