Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Mar 2017 10:59:47 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r316134 - in stable/11/libexec/rtld-elf: . mips
Message-ID:  <201703291059.v2TAxlEH024430@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Mar 29 10:59:46 2017
New Revision: 316134
URL: https://svnweb.freebsd.org/changeset/base/316134

Log:
  MFC r309068 (by jhb):
  Fix _mips_rtld_bind() to handle ELF filters.

Modified:
  stable/11/libexec/rtld-elf/mips/reloc.c
  stable/11/libexec/rtld-elf/rtld.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/libexec/rtld-elf/mips/reloc.c
==============================================================================
--- stable/11/libexec/rtld-elf/mips/reloc.c	Wed Mar 29 10:24:48 2017	(r316133)
+++ stable/11/libexec/rtld-elf/mips/reloc.c	Wed Mar 29 10:59:46 2017	(r316134)
@@ -240,10 +240,17 @@ _mips_rtld_bind(Obj_Entry *obj, Elf_Size
         Elf_Addr *got = obj->pltgot;
         const Elf_Sym *def;
         const Obj_Entry *defobj;
+        Elf_Addr *where;
         Elf_Addr target;
+        RtldLockState lockstate;
 
+	rlock_acquire(rtld_bind_lock, &lockstate);
+	if (sigsetjmp(lockstate.env, 0) != 0)
+		lock_upgrade(rtld_bind_lock, &lockstate);
+
+	where = &got[obj->local_gotno + reloff - obj->gotsym];
         def = find_symdef(reloff, obj, &defobj, SYMLOOK_IN_PLT, NULL,
-	    NULL);
+           &lockstate);
         if (def == NULL)
 		rtld_die();
 
@@ -251,9 +258,9 @@ _mips_rtld_bind(Obj_Entry *obj, Elf_Size
         dbg("bind now/fixup at %s sym # %jd in %s --> was=%p new=%p",
 	    obj->path,
 	    (intmax_t)reloff, defobj->strtab + def->st_name, 
-	    (void *)got[obj->local_gotno + reloff - obj->gotsym],
-	    (void *)target);
-        got[obj->local_gotno + reloff - obj->gotsym] = target;
+	    (void *)*where, (void *)target);
+	*where = target;
+	lock_release(rtld_bind_lock, &lockstate);
 	return (Elf_Addr)target;
 }
 

Modified: stable/11/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/11/libexec/rtld-elf/rtld.c	Wed Mar 29 10:24:48 2017	(r316133)
+++ stable/11/libexec/rtld-elf/rtld.c	Wed Mar 29 10:59:46 2017	(r316134)
@@ -702,6 +702,10 @@ rtld_resolve_ifunc(const Obj_Entry *obj,
 	return ((void *)target);
 }
 
+/*
+ * NB: MIPS uses a private version of this function (_mips_rtld_bind).
+ * Changes to this function should be applied there as well.
+ */
 Elf_Addr
 _rtld_bind(Obj_Entry *obj, Elf_Size reloff)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703291059.v2TAxlEH024430>