]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: mworker: don't call the thread and fdtab deinit
authorWilliam Lallemand <wlallemand@haproxy.com>
Mon, 24 Jun 2019 15:40:48 +0000 (17:40 +0200)
committerWilliam Lallemand <wlallemand@haproxy.org>
Mon, 24 Jun 2019 15:54:05 +0000 (17:54 +0200)
Before switching to wait mode, the per thread deinit should not be
called, because we didn't initiate threads and fdtab.

The problem is that the master could crash if we try to reload HAProxy

The commit 944e619 ("MEDIUM: mworker: wait mode use standard init code
path") removed the deinit code by accident, but its fix 7c756a8
("BUG/MEDIUM: mworker: fix FD leak upon reload") was incomplete and did
not took care of the WAIT_MODE.

This fix must be backported in 1.9 and 2.0

src/haproxy.c

index c3a448264ff9219555662e7d05a73852ed522493..617116c2b30c01b7936d6aae8dc1957f51d2f449 100644 (file)
@@ -634,11 +634,14 @@ void mworker_reload()
 
        /* 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();
+
+       if (getenv("HAPROXY_MWORKER_WAIT_ONLY") == NULL) {
+               /* 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();
+       }
 #if defined(USE_OPENSSL) && (HA_OPENSSL_VERSION_NUMBER >= 0x10101000L)
        if (global.ssl_used_frontend || global.ssl_used_backend)
                /* close random device FDs */