diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2016-09-03 20:25:59 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2016-09-03 20:25:59 +0200 |
commit | ead3cea7d8948113fe205243acbddbda609de5c9 (patch) | |
tree | df2c4e8064d2d96ebad64d014dd067845e89f2a7 /elf/dl-open.c | |
parent | 6b75ba1388bff6a81bad410d7318d385a043b3cb (diff) | |
download | glibc-ead3cea7d8948113fe205243acbddbda609de5c9.tar.gz glibc-ead3cea7d8948113fe205243acbddbda609de5c9.tar.xz glibc-ead3cea7d8948113fe205243acbddbda609de5c9.zip |
Set NODELETE flag after checking for NULL pointer
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, 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. Changelog: [BZ #19810] * elf/dl-open.c (dl_open_worker): Set DF_1_NODELETE flag later. * elf/tst-noload.c: New test case. * elf/Makefile (tests): Add tst-noload.
Diffstat (limited to 'elf/dl-open.c')
-rw-r--r-- | elf/dl-open.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c index 6f178b333d..3e5df4891e 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; |