]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: mworker: increase maxsock with each new worker
authorWilliam Lallemand <wlallemand@haproxy.org>
Mon, 19 Jun 2023 15:12:58 +0000 (17:12 +0200)
committerWilliam Lallemand <wlallemand@haproxy.org>
Mon, 19 Jun 2023 15:32:32 +0000 (17:32 +0200)
In ticket #2184, HAProxy is crashing in a BUG_ON() after a lot of reload
when the previous processes did not exit.

Each worker has a socketpair which is a FD in the master, when reloading
this FD still exists until the process leaves. But the global.maxconn
value is not incremented for each of these FD. So when there is too much
workers and the number of FD reaches maxsock, the next FD inserted in
the poller will crash the process.

This patch fixes the issue by increasing the maxsock for each remaining
worker.

Must be backported in every maintained version.

src/mworker.c

index b1115cc6e5627918730186717e522003035e3904..c4275a0fbba14b578cf06cbf84a98a19e263a8ab 100644 (file)
@@ -218,8 +218,12 @@ int mworker_env_to_proc_list()
 
                        } else if (strncmp(subtoken, "fd=", 3) == 0) {
                                child->ipc_fd[0] = atoi(subtoken+3);
+                               if (child->ipc_fd[0] > -1)
+                                       global.maxsock++;
                        } else if (strncmp(subtoken, "cfd=", 4) == 0) {
                                child->ipc_fd[1] = atoi(subtoken+4);
+                               if (child->ipc_fd[1] > -1)
+                                       global.maxsock++;
                        } else if (strncmp(subtoken, "pid=", 4) == 0) {
                                child->pid = atoi(subtoken+4);
                        } else if (strncmp(subtoken, "reloads=", 8) == 0) {