From 132decd2a043d0ccf799f42bf89f3ae0c11e95d5 Mon Sep 17 00:00:00 2001 From: Dave Flogeras Date: Fri, 27 Apr 2018 09:21:28 -0300 Subject: libdl: calculate the length for second parameter of munmap. Revert 35105679b9a900d58dadd0852e679c235f8176ba and add some debug code. --- ldso/libdl/libdl.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index d36ac6421..213eba49f 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -856,6 +856,8 @@ static int do_dlclose(void *vhandle, int need_fini) i < tpnt->n_phent; ppnt++, i++) { if (ppnt->p_type != PT_LOAD) continue; + if (ppnt->p_vaddr < start) + start = ppnt->p_vaddr; if (end < ppnt->p_vaddr + ppnt->p_memsz) end = ppnt->p_vaddr + ppnt->p_memsz; } @@ -962,13 +964,15 @@ static int do_dlclose(void *vhandle, int need_fini) } #endif - start = tpnt->mapaddr; - _dl_if_debug_print("unmapping before alignment: %s start: '%p' end: '%p'\n", tpnt->libname, start, end); end = (end + ADDR_ALIGN) & PAGE_ALIGN; start = start & ~ADDR_ALIGN; - _dl_if_debug_print("unmapping: %s start: '%p' end: '%p'\n", tpnt->libname, start, end); - if (end > start) - DL_LIB_UNMAP (tpnt, end - start); + if (end > start) { + _dl_if_debug_print("unmapping: %s at %p with length: '%p' until %p\n", tpnt->libname, tpnt->mapaddr, end - start, tpnt->mapaddr + (end - start)); + DL_LIB_UNMAP (tpnt, end - start); + } + else { + _dl_if_debug_print("NOT unmapping: %s at %p. startlibname, tpnt->mapaddr, start, end); + } /* Free elements in RTLD_LOCAL scope list */ for (runp = tpnt->rtld_local; runp; runp = tmp) { tmp = runp->next; -- cgit v1.2.3