summaryrefslogtreecommitdiff
path: root/elf/dl-open.c
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2016-09-03 20:25:59 +0200
committerAurelien Jarno <aurelien@aurel32.net>2016-09-03 20:25:59 +0200
commitead3cea7d8948113fe205243acbddbda609de5c9 (patch)
treedf2c4e8064d2d96ebad64d014dd067845e89f2a7 /elf/dl-open.c
parent6b75ba1388bff6a81bad410d7318d385a043b3cb (diff)
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.c12
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;