]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
elf: Call la_objclose for proxy link maps in _dl_fini (bug 32065)
authorFlorian Weimer <fweimer@redhat.com>
Fri, 9 Aug 2024 14:06:40 +0000 (16:06 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Fri, 20 Dec 2024 15:17:08 +0000 (16:17 +0100)
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
elf/dl-fini.c
elf/tst-audit23.c

index db996270de65e86a63e4f6500081b66e07bae914..a1a4c25829471510ee48d6124fc9a4a960ec04f5 100644 (file)
@@ -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
index c8c6553b8fdf701e8afdfb1807f618b1de1228a8..583c45f38a6e762ddb40ee5de397bf2e4f52baee 100644 (file)
@@ -236,13 +236,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