Message ID | 1457721020-5824-1-git-send-email-aurelien@aurel32.net |
---|---|
State | New |
Headers | show |
On 03/11/2016 07:30 PM, Aurelien Jarno wrote: > The commit b632bdd3 moved the setting of the DF_1_NODELETE flag earlier > in the dl_open_worker function. However when calling dlopen with both > RTLD_NODELETE and RTLD_NOLOAD (which in practice also requires > RTLD_LAZY), the pointer returned by _dl_map_object is NULL. This > condition is checked just after setting the flag, while it should be > done before. Fix that. How hard is it to create a test case for this? Thanks, Florian
On 2016-03-11 19:33, Florian Weimer wrote: > On 03/11/2016 07:30 PM, Aurelien Jarno wrote: > > The commit b632bdd3 moved the setting of the DF_1_NODELETE flag earlier > > in the dl_open_worker function. However when calling dlopen with both > > RTLD_NODELETE and RTLD_NOLOAD (which in practice also requires > > RTLD_LAZY), the pointer returned by _dl_map_object is NULL. This > > condition is checked just after setting the flag, while it should be > > done before. Fix that. > > How hard is it to create a test case for this? That should be relatively easy I guess. If the patch makes sense, I can try to add one. Aurelien
On 03/11/2016 07:43 PM, Aurelien Jarno wrote: > On 2016-03-11 19:33, Florian Weimer wrote: >> On 03/11/2016 07:30 PM, Aurelien Jarno wrote: >>> The commit b632bdd3 moved the setting of the DF_1_NODELETE flag earlier >>> in the dl_open_worker function. However when calling dlopen with both >>> RTLD_NODELETE and RTLD_NOLOAD (which in practice also requires >>> RTLD_LAZY), the pointer returned by _dl_map_object is NULL. This >>> condition is checked just after setting the flag, while it should be >>> done before. Fix that. >> >> How hard is it to create a test case for this? > > That should be relatively easy I guess. If the patch makes sense, I can > try to add one. The change looks reasonable and correct to me, but the dynamic linker scares me … Thanks, Florian
diff --git a/ChangeLog b/ChangeLog index 440b021..fe113b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-03-09 Aurelien Jarno <aurelien@aurel32.net> + + [BZ #19810] + * elf/dl-open.c (dl_open_worker): Set DF_1_NODELETE flag later. + 2016-03-11 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> * sysdeps/powerpc/powerpc32/power4/memcmp.S (memcmp): Rearrange diff --git a/elf/dl-open.c b/elf/dl-open.c index 6f178b3..3e5df48 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -226,12 +226,6 @@ dl_open_worker (void *a) args->map = new = _dl_map_object (call_map, file, lt_loaded, 0, mode | __RTLD_CALLMAP, args->nsid); - /* Mark the object as not deletable if the RTLD_NODELETE flags was passed. - Do this early so that we don't skip marking the object if it was - already loaded. */ - if (__glibc_unlikely (mode & RTLD_NODELETE)) - new->l_flags_1 |= DF_1_NODELETE; - /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is set and the object is not already loaded. */ if (new == NULL) @@ -240,6 +234,12 @@ dl_open_worker (void *a) return; } + /* Mark the object as not deletable if the RTLD_NODELETE flags was passed. + Do this early so that we don't skip marking the object if it was + already loaded. */ + if (__glibc_unlikely (mode & RTLD_NODELETE)) + new->l_flags_1 |= DF_1_NODELETE; + if (__glibc_unlikely (mode & __RTLD_SPROF)) /* This happens only if we load a DSO for 'sprof'. */ return;