Browse Source

Revert "libdl: fix size parameter when unmap library in dlclose"

This reverts commit 9b42da7d0558884e2a3cc9a8674ccfc752369610.

This fixes a long standing bug in dlclose().
Can be seen with apache and mod_php or just by executing
php -m to list all modules.

Reported-by: Bernd Kuhls <bernd.kuhls@t-online.de>
Waldemar Brodkorb 6 years ago
parent
commit
952bb00f0b
1 changed files with 2 additions and 6 deletions
  1. 2 6
      ldso/libdl/libdl.c

+ 2 - 6
ldso/libdl/libdl.c

@@ -790,7 +790,7 @@ static int do_dlclose(void *vhandle, int need_fini)
 	int (*dl_elf_fini) (void);
 	void (*dl_brk) (void);
 	struct dyn_elf *handle;
-	unsigned int end = 0, start = 0xffffffff;
+	unsigned int end;
 	unsigned int i, j;
 	struct r_scope_elem *ls, *ls_next = NULL;
 	struct elf_resolve **handle_rlist;
@@ -867,8 +867,6 @@ 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;
 			}
@@ -975,9 +973,7 @@ static int do_dlclose(void *vhandle, int need_fini)
 			}
 #endif
 
-			end = (end + ADDR_ALIGN) & PAGE_ALIGN;
-			start = start & ~ADDR_ALIGN;
-			DL_LIB_UNMAP (tpnt, end - start);
+			DL_LIB_UNMAP (tpnt, end - tpnt->mapaddr);
 			/* Free elements in RTLD_LOCAL scope list */
 			for (runp = tpnt->rtld_local; runp; runp = tmp) {
 				tmp = runp->next;