From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4230 invoked by alias); 26 May 2010 17:07:51 -0000 Received: (qmail 4210 invoked by uid 22791); 26 May 2010 17:07:50 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SARE_BAYES_5x7,SARE_BAYES_5x8,SARE_BAYES_6x7,SARE_BAYES_6x8,SPF_HELO_PASS,TW_LV,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 26 May 2010 17:07:46 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o4QH7ikk000723 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 26 May 2010 13:07:44 -0400 Received: from hase.home (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o4QH7hHY009298 for ; Wed, 26 May 2010 13:07:44 -0400 From: Andreas Schwab To: libc-hacker@sourceware.org Subject: [PATCH] Fix scope handling during dl_close X-Yow: Not SENSUOUS... only ``FROLICSOME''... and in need of DENTAL WORK... in PAIN!!! Date: Wed, 26 May 2010 17:07:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2010-05/txt/msg00007.txt.bz2 This fixes redhat bug 593675. Andreas. 2010-05-26 Andreas Schwab * elf/Makefile: Add rules to build and run unload8 test. * elf/unload8.c: New file. * elf/unload8mod1.c: New file. * elf/unload8mod1x.c: New file. * elf/unload8mod2.c: New file. * elf/unload8mod3.c: New file. * elf/dl-close.c (_dl_close_worker): Reset private search list if it wasn't used. --- elf/Makefile | 10 +++++++++- elf/dl-close.c | 7 +++++++ elf/unload8.c | 33 +++++++++++++++++++++++++++++++++ elf/unload8mod1.c | 7 +++++++ elf/unload8mod1x.c | 1 + elf/unload8mod2.c | 7 +++++++ elf/unload8mod3.c | 27 +++++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 1 deletions(-) create mode 100644 elf/unload8.c create mode 100644 elf/unload8mod1.c create mode 100644 elf/unload8mod1x.c create mode 100644 elf/unload8mod2.c create mode 100644 elf/unload8mod3.c diff --git a/elf/Makefile b/elf/Makefile index c1bf974..046108e 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -89,6 +89,7 @@ distribute := rtld-Rules \ unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \ unload6mod1.c unload6mod2.c unload6mod3.c \ unload7mod1.c unload7mod2.c \ + unload8mod1.c unload8mod1x.c unload8mod2.c unload8mod3.c \ tst-audit1.c tst-audit2.c tst-audit3.c tst-audit4.c \ tst-auditmod1.c tst-auditmod3a.c tst-auditmod3b.c \ tst-auditmod4a.c tst-auditmod4b.c \ @@ -196,7 +197,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \ tst-dlmodcount tst-dlopenrpath tst-deep1 \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ - unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \ + unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ tst-audit1 tst-audit2 \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 @@ -249,6 +250,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ unload4mod1 unload4mod2 unload4mod3 unload4mod4 \ unload6mod1 unload6mod2 unload6mod3 \ unload7mod1 unload7mod2 \ + unload8mod1 unload8mod1x unload8mod2 unload8mod3 \ order2mod1 order2mod2 order2mod3 order2mod4 \ tst-unique1mod1 tst-unique1mod2 \ tst-unique2mod1 tst-unique2mod2 @@ -524,6 +526,9 @@ $(objpfx)unload6mod2.so: $(libdl) $(objpfx)unload6mod3.so: $(libdl) $(objpfx)unload7mod1.so: $(libdl) $(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so +$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so +$(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so +$(objpfx)unload8mod3.so: $(libdl) LDFLAGS-tst-tlsmod5.so = -nostdlib LDFLAGS-tst-tlsmod6.so = -nostdlib @@ -825,6 +830,9 @@ $(objpfx)unload7: $(libdl) $(objpfx)unload7.out: $(objpfx)unload7mod1.so $(objpfx)unload7mod2.so unload7-ENV = MALLOC_PERTURB_=85 +$(objpfx)unload8: $(libdl) +$(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so + ifdef libdl $(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a $(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so diff --git a/elf/dl-close.c b/elf/dl-close.c index 700e765..f47d5f8 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -421,6 +421,13 @@ _dl_close_worker (struct link_map *map) imap->l_scope_max = new_size; } + else if (new_list != NULL) + { + /* We didn't change the scope array, so reset the search + list. */ + imap->l_searchlist.r_list = NULL; + imap->l_searchlist.r_nlist = 0; + } /* The loader is gone, so mark the object as not having one. Note: l_idx != IDX_STILL_USED -> object will be removed. */ diff --git a/elf/unload8.c b/elf/unload8.c new file mode 100644 index 0000000..f984a38 --- /dev/null +++ b/elf/unload8.c @@ -0,0 +1,33 @@ +#include +#include + +int +main (void) +{ + void *h = dlopen ("$ORIGIN/unload8mod1.so", RTLD_LAZY); + if (h == NULL) + { + puts ("dlopen unload8mod1.so failed"); + return 1; + } + + void *h2 = dlopen ("$ORIGIN/unload8mod1x.so", RTLD_LAZY); + if (h2 == NULL) + { + puts ("dlopen unload8mod1x.so failed"); + return 1; + } + dlclose (h2); + + int (*mod1) (void) = dlsym (h, "mod1"); + if (mod1 == NULL) + { + puts ("dlsym failed"); + return 1; + } + + mod1 (); + dlclose (h); + + return 0; +} diff --git a/elf/unload8mod1.c b/elf/unload8mod1.c new file mode 100644 index 0000000..fe7e81c --- /dev/null +++ b/elf/unload8mod1.c @@ -0,0 +1,7 @@ +extern void mod2 (void); + +void +mod1 (void) +{ + mod2 (); +} diff --git a/elf/unload8mod1x.c b/elf/unload8mod1x.c new file mode 100644 index 0000000..835b634 --- /dev/null +++ b/elf/unload8mod1x.c @@ -0,0 +1 @@ +int mod1x; diff --git a/elf/unload8mod2.c b/elf/unload8mod2.c new file mode 100644 index 0000000..2fd8b67 --- /dev/null +++ b/elf/unload8mod2.c @@ -0,0 +1,7 @@ +extern void mod3 (void); + +void +mod2 (void) +{ + mod3 (); +} diff --git a/elf/unload8mod3.c b/elf/unload8mod3.c new file mode 100644 index 0000000..d49e22b --- /dev/null +++ b/elf/unload8mod3.c @@ -0,0 +1,27 @@ +#include +#include +#include + +void +mod3_fini2 (void) +{ +} + +void +mod3_fini (void) +{ + mod3_fini2 (); +} + +void +mod3 (void) +{ + void *h = dlopen ("$ORIGIN/unload8mod2.so", RTLD_LAZY); + if (h == NULL) + { + puts ("dlopen unload8mod2.so failed"); + exit (1); + } + + atexit (mod3_fini); +} -- 1.7.1 -- Andreas Schwab, schwab@redhat.com GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E "And now for something completely different."