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

Message ID 075f5d6cae8dc081de56048134dd53da6a29b605.1725379370.git.fweimer@redhat.com
State Superseded
Headers
Series Audit fixes for proxy link maps |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm fail Test failed

Commit Message

Florian Weimer Sept. 3, 2024, 4:05 p.m. UTC
  ---
 elf/dl-fini.c     |  9 +++++++++
 elf/tst-audit23.c | 19 ++++++++++++++++---
 2 files changed, 25 insertions(+), 3 deletions(-)
  

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 55929c2fd4..71adbe6942 100644
--- a/elf/tst-audit23.c
+++ b/elf/tst-audit23.c
@@ -241,13 +241,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