diff options
author | Carlos O'Donell <carlos@redhat.com> | 2017-12-12 20:35:05 -0800 |
---|---|---|
committer | Carlos O'Donell <carlos@redhat.com> | 2017-12-15 20:22:29 -0800 |
commit | 93930ea9351c0c4a239e3dcb83f1398cce4e4d43 (patch) | |
tree | dc38ac46edbdc3ec877fa7e12194daba7a1d6b2b /elf | |
parent | 9d7a3741c9e59eba87fb3ca6b9f979befce07826 (diff) | |
download | glibc-93930ea9351c0c4a239e3dcb83f1398cce4e4d43.zip glibc-93930ea9351c0c4a239e3dcb83f1398cce4e4d43.tar.gz glibc-93930ea9351c0c4a239e3dcb83f1398cce4e4d43.tar.bz2 |
Fix tst-leaks1 (bug 14681)
The test tst-leaks1 exercises calling dlopen with a $ORIGIN DST.
This results in a theoretical leak e.g.
Memory not freed:
-----------------
Address Size Caller
0x0000000001d766c0 0x21 at 0x7fb1bd8bf4ab
Or as seen via valgrind:
==27582== 33 bytes in 1 blocks are still reachable in loss record 1 of 1
==27582== at 0x4C2CB6B: malloc (vg_replace_malloc.c:299)
==27582== by 0x40124AA: _dl_get_origin (dl-origin.c:50)
==27582== by 0x4007DB9: expand_dynamic_string_token (dl-load.c:382)
==27582== by 0x400899C: _dl_map_object (dl-load.c:2160)
==27582== by 0x4013020: dl_open_worker (dl-open.c:224)
==27582== by 0x5166F9B: _dl_catch_exception (dl-error-skeleton.c:198)
==27582== by 0x4012BD9: _dl_open (dl-open.c:594)
==27582== by 0x4E39EF5: dlopen_doit (dlopen.c:66)
==27582== by 0x5166F9B: _dl_catch_exception (dl-error-skeleton.c:198)
==27582== by 0x516700E: _dl_catch_error (dl-error-skeleton.c:217)
==27582== by 0x4E3A514: _dlerror_run (dlerror.c:162)
==27582== by 0x4E39F70: dlopen@@GLIBC_2.2.5 (dlopen.c:87)
There is no real leak.
The calling link map (the executable's link map) has it's l_origin
expanded for future use as part of _dl_get_origin, and that results
in the main executable link map having a N-byte allocation for
l->l_origin that is never freed since the executable's link map is
just a part of the process.
To take this into account we do one dlopen with $ORIGIN before
calling mtrace to force the initialization of the executable link
map.
Signed-off-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'elf')
-rw-r--r-- | elf/tst-leaks1.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/elf/tst-leaks1.c b/elf/tst-leaks1.c index d67e826..75bc92d 100644 --- a/elf/tst-leaks1.c +++ b/elf/tst-leaks1.c @@ -6,13 +6,28 @@ static int do_test (void) { + void *h; + int ret = 0; + /* Carry out *one* failing call to dlopen before starting mtrace to + force any one-time inintialization that may happen to the + executable link map e.g. expansion and caching of $ORIGIN. */ + h = dlopen ("$ORIGIN/tst-leaks1.o", RTLD_LAZY); + if (h != NULL) + { + puts ("dlopen unexpectedly succeeded"); + ret = 1; + dlclose (h); + } + + /* Start tracing and run each test 5 times to see if there are any + leaks in the failing dlopen. */ mtrace (); - int ret = 0; for (int i = 0; i < 10; i++) { - void *h = dlopen (i < 5 ? "./tst-leaks1.c" - : "$ORIGIN/tst-leaks1.o", RTLD_LAZY); + h = dlopen (i < 5 + ? "./tst-leaks1.c" + : "$ORIGIN/tst-leaks1.o", RTLD_LAZY); if (h != NULL) { puts ("dlopen unexpectedly succeeded"); |