From 7c756a8ccc4e64fcb46d72a3cfc38dcf1ddbbc54 Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Mon, 26 Nov 2018 11:53:40 +0100 Subject: [PATCH] BUG/MEDIUM: mworker: fix FD leak upon reload We reintroduced some FDs leaking by using a poller and some listeners in the master. The master proxy needs to be stopped to avoid leaking its listeners, the polling loop needs to be deinit, and the thread waker pipe need to be closed too. No backport needed. --- src/haproxy.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/haproxy.c b/src/haproxy.c index b4e12f14a9..2c42a7096a 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -704,6 +704,7 @@ static void mworker_reload() int next_argc = 0; int j; char *msg = NULL; + struct per_thread_deinit_fct *ptdf; mworker_block_signals(); #if defined(USE_SYSTEMD) @@ -714,6 +715,18 @@ static void mworker_reload() mworker_proc_list_to_env(); /* put the children description in the env */ + /* during the reload we must ensure that every FDs that can't be + * reuse (ie those that are not referenced in the proc_list) + * are closed or they will leak. */ + + /* close the listeners FD */ + mworker_cli_proxy_stop(); + /* close the poller FD and the thread waker pipe FD */ + list_for_each_entry(ptdf, &per_thread_deinit_list, list) + ptdf->fct(); + if (fdtab) + deinit_pollers(); + /* compute length */ while (next_argv[next_argc]) next_argc++; -- 2.39.5