From 14be0795f4ad0ec7c689cfdf9e891bce24241999 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Fri, 27 Apr 2018 06:00:54 +0100 Subject: libdl: first execute all destructors, then munmap library Fix problem which might exist since 2011. We need to execute the destructors for all dependant libraries, before munmap the shared libraries, otherwise running destructor of a dependent library might cause a segfault, trying to access an already unmapped memory. This fixes for example segfaults while running php -m with ldap module. Reported-By: Dave Flogeras Tested-By: Dave Flogeras --- ldso/libdl/libdl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index 213eba49f..ac0acd504 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -849,7 +849,12 @@ static int do_dlclose(void *vhandle, int need_fini) DL_CALL_FUNC_AT_ADDR (dl_elf_fini, tpnt->loadaddr, (int (*)(void))); } } + } + } + for (j = 0; j < handle->init_fini.nlist; ++j) { + tpnt = handle->init_fini.init_fini[j]; + if (tpnt->usage_count == 0) { _dl_if_debug_print("unmapping: %s\n", tpnt->libname); end = 0; for (i = 0, ppnt = tpnt->ppnt; -- cgit v1.2.3