1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-12-24 17:51:17 +03:00
1998-03-15  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/wordexp-test.c: Add more tests.
	(testit): Fix logic.

	* posix/wordexp.c (exec_comm): In the child, redirect stderr to
	/dev/null instead of closing it, close pipe.  Always chop off all
	trailing newlines.  Kill and reap child before returning error.
	(w_addword, parse_glob): Fix memory leak.
	(wordexp): Fix dangling pointer problem.

1998-03-16  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-close.c (_dl_close): Correct and simplify unmapping.

	* posix/wordexp-test.c (main): Fix little thinkos and typos.

	* catgets/Makefile (CPPFLAGS): Change NLSPATH to also examine
	directory index by only the language.
This commit is contained in:
Ulrich Drepper
1998-03-16 18:30:44 +00:00
parent 6760028826
commit 22bc797882
5 changed files with 95 additions and 37 deletions

View File

@@ -80,7 +80,8 @@ _dl_close (struct link_map *map)
/* That was the last reference, and this was a dlopen-loaded
object. We can unmap it. */
const ElfW(Phdr) *ph;
const ElfW(Phdr) *eph;
const ElfW(Phdr) *first, *last;
ElfW(Addr) mapstart, mapend;
if (imap->l_info[DT_FINI])
/* Call its termination function. */
@@ -100,24 +101,23 @@ _dl_close (struct link_map *map)
_dl_global_scope_end[1] = NULL;
}
/* Find the first entry specifying a load command. We have
to determine this now since the table itself is also loaded. */
for (eph = imap->l_phdr; eph < imap->l_phdr + imap->l_phnum; ++eph)
if (eph->p_type == PT_LOAD)
break;
/* Unmap the segments. */
for (ph = imap->l_phdr + (imap->l_phnum - 1); ph >= eph; --ph)
/* We can unmap all the maps at once. We just have to determine
the length and the `munmap' call does the rest. */
first = last = NULL;
for (ph = imap->l_phdr; ph < imap->l_phdr + imap->l_phnum; ++ph)
if (ph->p_type == PT_LOAD)
{
ElfW(Addr) mapstart = ph->p_vaddr & ~(ph->p_align - 1);
ElfW(Addr) mapend = ((ph->p_vaddr + ph->p_memsz
+ ph->p_align - 1)
& ~(ph->p_align - 1));
__munmap ((caddr_t) (imap->l_addr + mapstart),
mapend - mapstart);
if (first == NULL)
first = ph;
last = ph;
}
/* Now we have all the information we need for the unmapping.
See the method used in `_dl_map_object_from_fd'. */
mapstart = first->p_vaddr & ~(first->p_align - 1);
mapend = last->p_vaddr + last->p_memsz;
__munmap ((caddr_t) (imap->l_addr + mapstart), mapend - mapstart);
/* Finally, unlink the data structure and free it. */
if (imap->l_prev)
imap->l_prev->l_next = imap->l_next;