summaryrefslogtreecommitdiff
path: root/ldso/libdl/libdl.c
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@uclibc-ng.org>2018-03-15 20:35:05 +0100
committerWaldemar Brodkorb <wbx@uclibc-ng.org>2018-03-15 20:35:05 +0100
commitbf4c2d242f587700e3eb2ffd5721ddaf3cdbc7e5 (patch)
tree7461fbd662003c55ea59b4f8d0b26282592a2a18 /ldso/libdl/libdl.c
parent5bdc2b4dee516c8e4d7ba9f5d26c9bf31418b52f (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.c14
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 */