]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUILD: peers: check allocation error during peers_init_sync()
authorWilly Tarreau <w@1wt.eu>
Mon, 15 Oct 2018 09:18:03 +0000 (11:18 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 15 Oct 2018 11:24:43 +0000 (13:24 +0200)
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.

include/proto/peers.h
src/cfgparse.c
src/peers.c

index 782b66e4d2e78bffc1b7f2f6d0d151ad13130e82..9d4aaff232e930667dc559af2da658019ef18cc8 100644 (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);
 
index 1ca10bef27bed00bdf27eb459a105560594344bf..5a6b705ef4f11b305e9b0a6ca49888c27db07014 100644 (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;
                        }
index e61caaf93f81eea0b9abbafd877d5e620f009feb..c16617d9098efd8a183cc7a8d4be2e7e82c9a54b 100644 (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;
 }