about summary refs log tree commit diff
path: root/elf/dl-load.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2015-11-09 16:52:31 +0100
committerFlorian Weimer <fweimer@redhat.com>2015-11-09 17:01:46 +0100
commita1b85ae88b1a664e93ca0182c82f7763dd5a1754 (patch)
tree1d79be13026ebc25bc24caabfc1f79281b44a539 /elf/dl-load.c
parent37d13b179cd726bb6d61bfe2f31a1206bc1d9703 (diff)
downloadglibc-a1b85ae88b1a664e93ca0182c82f7763dd5a1754.tar.gz
glibc-a1b85ae88b1a664e93ca0182c82f7763dd5a1754.tar.xz
glibc-a1b85ae88b1a664e93ca0182c82f7763dd5a1754.zip
ld.so: Add original DSO name if overridden by audit module [BZ #18251]
	* elf/dl-load.c (_dl_map_object_from_fd): Add additional parameter
	for original name of the DSO.  Add it to the name list of the DSO
	if it is actually given.
	(_dl_map_object): Keep track of whether an audit module rewrote
	the file name.  If yes, pass the original name to
	_dl_map_object_from_fd in a new parameter, otherwise NULL.  When
	debugging is enabled, log the change of the file name.
	* sysdeps/mach/hur/dl-sysdep.c: Adjust commented-out call to
	_dl_map_object_from_fd.
	* elf/Makefile: Build and run tst-audit11 and tst-audit12.
	* elf/tst-audit11.c: New file
	* elf/tst-auditmod11.c: New file.
	* elf/tst-audit11mod1.c: New file.
	* elf/tst-audit11mod2.c: New file.
	* elf/tst-audit11mod2.map: New file.
	* elf/tst-audit12.c: New file
	* elf/tst-auditmod12.c: New file.
	* elf/tst-audit12mod1.c: New file.
	* elf/tst-audit12mod2.c: New file.
	* elf/tst-audit12mod2.map: New file.
	* elf/tst-audit12mod3.c: New file.
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r--elf/dl-load.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 993a419bdd..c5e948e7e0 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -863,9 +863,10 @@ lose (int code, int fd, const char *name, char *realname, struct link_map *l,
 static
 #endif
 struct link_map *
-_dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
-			char *realname, struct link_map *loader, int l_type,
-			int mode, void **stack_endp, Lmid_t nsid)
+_dl_map_object_from_fd (const char *name, const char *origname, int fd,
+			struct filebuf *fbp, char *realname,
+			struct link_map *loader, int l_type, int mode,
+			void **stack_endp, Lmid_t nsid)
 {
   struct link_map *l = NULL;
   const ElfW(Ehdr) *header;
@@ -1391,6 +1392,17 @@ cannot enable executable stack as shared object requires");
   /* Finally the file information.  */
   l->l_file_id = id;
 
+#ifdef SHARED
+  /* When auditing is used the recorded names might not include the
+     name by which the DSO is actually known.  Add that as well.  */
+  if (__glibc_unlikely (origname != NULL))
+    add_name_to_object (l, origname);
+#else
+  /* Audit modules only exist when linking is dynamic so ORIGNAME
+     cannot be non-NULL.  */
+  assert (origname == NULL);
+#endif
+
   /* When we profile the SONAME might be needed for something else but
      loading.  Add it right away.  */
   if (__glibc_unlikely (GLRO(dl_profile) != NULL)
@@ -1904,6 +1916,7 @@ _dl_map_object (struct link_map *loader, const char *name,
 		int type, int trace_mode, int mode, Lmid_t nsid)
 {
   int fd;
+  const char *origname = NULL;
   char *realname;
   char *name_copy;
   struct link_map *l;
@@ -1961,6 +1974,7 @@ _dl_map_object (struct link_map *loader, const char *name,
 	{
 	  if (afct->objsearch != NULL)
 	    {
+	      const char *before = name;
 	      name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
 				      LA_SER_ORIG);
 	      if (name == NULL)
@@ -1969,6 +1983,15 @@ _dl_map_object (struct link_map *loader, const char *name,
 		  fd = -1;
 		  goto no_file;
 		}
+	      if (before != name && strcmp (before, name) != 0)
+		{
+		  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
+		    _dl_debug_printf ("audit changed filename %s -> %s\n",
+				      before, name);
+
+		  if (origname == NULL)
+		    origname = before;
+		}
 	    }
 
 	  afct = afct->next;
@@ -2183,8 +2206,8 @@ _dl_map_object (struct link_map *loader, const char *name,
     }
 
   void *stack_end = __libc_stack_end;
-  return _dl_map_object_from_fd (name, fd, &fb, realname, loader, type, mode,
-				 &stack_end, nsid);
+  return _dl_map_object_from_fd (name, origname, fd, &fb, realname, loader,
+				 type, mode, &stack_end, nsid);
 }
 
 struct add_path_state