Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Nov 2018 14:52:44 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r340675 - head/libexec/rtld-elf
Message-ID:  <201811201452.wAKEqib1032834@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Nov 20 14:52:43 2018
New Revision: 340675
URL: https://svnweb.freebsd.org/changeset/base/340675

Log:
  rtld: when immediate bind mode is requested, process irelocs in PLT
  immediately after other PLT relocs.
  
  Otherwise, if the object has relro page, we write to readonly page,
  and we would need to use mprotect(2) two more times to fix it.  Note
  that resolve_object_ifunc() does nothing when called second time, so
  there is no need to avoid existing call.
  
  Reported and tested by:	emaste
  PR:	233333
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Tue Nov 20 14:18:57 2018	(r340674)
+++ head/libexec/rtld-elf/rtld.c	Tue Nov 20 14:52:43 2018	(r340675)
@@ -142,6 +142,7 @@ static int relocate_object(Obj_Entry *obj, bool bind_n
     int flags, RtldLockState *lockstate);
 static int relocate_objects(Obj_Entry *, bool, Obj_Entry *, int,
     RtldLockState *);
+static int resolve_object_ifunc(Obj_Entry *, bool, int, RtldLockState *);
 static int resolve_objects_ifunc(Obj_Entry *first, bool bind_now,
     int flags, RtldLockState *lockstate);
 static int rtld_dirname(const char *, char *);
@@ -2885,9 +2886,11 @@ relocate_object(Obj_Entry *obj, bool bind_now, Obj_Ent
 	if (reloc_plt(obj) == -1)
 		return (-1);
 	/* Relocate the jump slots if we are doing immediate binding. */
-	if (obj->bind_now || bind_now)
-		if (reloc_jmpslots(obj, flags, lockstate) == -1)
+	if (obj->bind_now || bind_now) {
+		if (reloc_jmpslots(obj, flags, lockstate) == -1 ||
+		    resolve_object_ifunc(obj, true, flags, lockstate) == -1)
 			return (-1);
+	}
 
 	/*
 	 * Process the non-PLT IFUNC relocations.  The relocations are



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