diff mbox series

[2/3] elf: Call la_objclose for proxy link maps in _dl_fini (bug 32065)

Message ID 987ab81cd241e6dd4d82bcd5ba68f1504ec89d85.1723239322.git.fweimer@redhat.com
State New
Headers show
Series Audit fixes for proxy link maps | expand

Commit Message

Florian Weimer Aug. 9, 2024, 9:44 p.m. UTC
---
 elf/dl-fini.c     |  9 +++++++++
 elf/tst-audit23.c | 19 ++++++++++++++++---
 2 files changed, 25 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/elf/dl-fini.c b/elf/dl-fini.c
index db996270de..a1a4c25829 100644
--- a/elf/dl-fini.c
+++ b/elf/dl-fini.c
@@ -69,6 +69,7 @@  _dl_fini (void)
 
 	  unsigned int i;
 	  struct link_map *l;
+	  struct link_map *proxy_link_map = NULL;
 	  assert (nloaded != 0 || GL(dl_ns)[ns]._ns_loaded == NULL);
 	  for (l = GL(dl_ns)[ns]._ns_loaded, i = 0; l != NULL; l = l->l_next)
 	    /* Do not handle ld.so in secondary namespaces.  */
@@ -84,6 +85,11 @@  _dl_fini (void)
 		   are not dlclose()ed from underneath us.  */
 		++l->l_direct_opencount;
 	      }
+	    else
+	      /* Used below to call la_objclose for the ld.so proxy
+		 link map.  */
+	      proxy_link_map = l;
+
 	  assert (ns != LM_ID_BASE || i == nloaded);
 	  assert (ns == LM_ID_BASE || i == nloaded || i == nloaded - 1);
 	  unsigned int nmaps = i;
@@ -122,6 +128,9 @@  _dl_fini (void)
 	      --l->l_direct_opencount;
 	    }
 
+	  if (proxy_link_map != NULL)
+	    _dl_audit_objclose (proxy_link_map);
+
 #ifdef SHARED
 	  _dl_audit_activity_nsid (ns, LA_ACT_CONSISTENT);
 #endif
diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
index 8b3a09a7e1..09318981e3 100644
--- a/elf/tst-audit23.c
+++ b/elf/tst-audit23.c
@@ -225,13 +225,26 @@  do_test (int argc, char *argv[])
 	}
     }
 
+  Lmid_t lmid_other = LM_ID_NEWLM;
+  unsigned int other_namespace_count = 0;
   for (size_t i = 0; i < nobjs; i++)
     {
-      /* This subtest currently does not pass because of bug 32065.  */
-      if (! (endswith (objs[i].lname, LD_SO) && objs[i].lmid != LM_ID_BASE))
-	TEST_COMPARE (objs[i].closed, true);
+      if (objs[i].lmid != LM_ID_BASE)
+	{
+	  if (lmid_other == LM_ID_NEWLM)
+	    lmid_other = objs[i].lmid;
+	  TEST_COMPARE (objs[i].lmid, lmid_other);
+	  ++other_namespace_count;
+	  if (!(endswith (objs[i].lname, "/" LIBC_SO)
+		|| endswith (objs[i].lname, "/" LD_SO)))
+	    FAIL ("unexpected object in secondary namespace: %s",
+		  objs[i].lname);
+	}
+      TEST_COMPARE (objs[i].closed, true);
       free (objs[i].lname);
     }
+  /* Both libc.so and ld.so should be present.  */
+  TEST_COMPARE (other_namespace_count, 2);
 
   /* la_activity(LA_ACT_CONSISTENT) should be the last callback received.
      Since only one link map may be not-CONSISTENT at a time, this also