diff options
author | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2018-03-15 20:35:05 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2018-03-15 20:35:05 +0100 |
commit | bf4c2d242f587700e3eb2ffd5721ddaf3cdbc7e5 (patch) | |
tree | 7461fbd662003c55ea59b4f8d0b26282592a2a18 /ldso/libdl/libdl.c | |
parent | 5bdc2b4dee516c8e4d7ba9f5d26c9bf31418b52f (diff) |
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.
Diffstat (limited to 'ldso/libdl/libdl.c')
-rw-r--r-- | ldso/libdl/libdl.c | 14 |
1 files changed, 13 insertions, 1 deletions
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 */ |