From bf4c2d242f587700e3eb2ffd5721ddaf3cdbc7e5 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Thu, 15 Mar 2018 20:35:05 +0100 Subject: libdl: fix dlclose() issue There is a patch included in https://bugs.busybox.net/show_bug.cgi?id=6158 from 2013, which was never applied. This really fixes the php -m segfaults. --- ldso/libdl/libdl.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index d102a48ab..8f036b991 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -792,7 +792,7 @@ static int do_dlclose(void *vhandle, int need_fini) struct dyn_elf *handle; ElfW(Addr) end = 0, start = (ElfW(Addr))(~0ULL); unsigned int i, j; - struct r_scope_elem *ls, *ls_next = NULL; + struct r_scope_elem *ls, *ls_next = NULL, *run_scope; struct elf_resolve **handle_rlist; #if defined(USE_TLS) && USE_TLS @@ -999,6 +999,18 @@ static int do_dlclose(void *vhandle, int need_fini) break; } } + for (run_scope = &_dl_loaded_modules->symbol_scope; run_scope; run_scope = run_scope->next) { + for (i = 0; i < run_scope->r_nlist; ++i) { + if (run_scope->r_list[i] == tpnt) { + _dl_if_debug_print("removed from symbol_scope: %s\n", tpnt->libname); + for (j = i; j < run_scope->r_nlist - 1; ++j) { + run_scope->r_list[j] = run_scope->r_list[j + 1]; + } + --run_scope->r_nlist; + break; + } + } + } } /* Next, remove tpnt from the global symbol table list */ -- cgit v1.2.3