This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.26.9000-990-g93930ea


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  93930ea9351c0c4a239e3dcb83f1398cce4e4d43 (commit)
      from  9d7a3741c9e59eba87fb3ca6b9f979befce07826 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=93930ea9351c0c4a239e3dcb83f1398cce4e4d43

commit 93930ea9351c0c4a239e3dcb83f1398cce4e4d43
Author: Carlos O'Donell <carlos@redhat.com>
Date:   Tue Dec 12 20:35:05 2017 -0800

    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>

diff --git a/ChangeLog b/ChangeLog
index e9f203f..0f2936c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-12-12  Carlos O'Donell <carlos@redhat.com>
+
+	[BZ #14681]
+	* elf/tst-leaks1.c (do_test): Call one dlopen with $ORIGIN expansion
+	before mtrace.
+
 2017-12-15  H.J. Lu  <hongjiu.lu@intel.com>
 
 	[BZ #19574]
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");

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog        |    6 ++++++
 elf/tst-leaks1.c |   21 ++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]