Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Aug 2015 17:02:43 +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: r286582 - head/lib/libthr/thread
Message-ID:  <201508101702.t7AH2hak035535@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Aug 10 17:02:42 2015
New Revision: 286582
URL: https://svnweb.freebsd.org/changeset/base/286582

Log:
  Pre-resolve symbols required for the deferred signal processing.  This
  avoids recursion into rtld when leaving libthr critical section for
  the deferred signal delivery.
  
  For the same reason, use syscall(2) instead of referencing
  __sys_sigreturn(2).  Syscall() is already pre-resolved for fork()
  interceptor.
  
  Tested by:	Andre Meiser <ortadur@web.de>
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/lib/libthr/thread/thr_rtld.c
  head/lib/libthr/thread/thr_sig.c

Modified: head/lib/libthr/thread/thr_rtld.c
==============================================================================
--- head/lib/libthr/thread/thr_rtld.c	Mon Aug 10 16:32:47 2015	(r286581)
+++ head/lib/libthr/thread/thr_rtld.c	Mon Aug 10 17:02:42 2015	(r286582)
@@ -185,7 +185,9 @@ _thr_rtld_init(void)
 {
 	struct RtldLockInfo	li;
 	struct pthread		*curthread;
+	ucontext_t *uc;
 	long dummy = -1;
+	int uc_len;
 
 	curthread = _get_curthread();
 
@@ -231,4 +233,9 @@ _thr_rtld_init(void)
 	_thr_signal_block(curthread);
 	_rtld_thread_init(&li);
 	_thr_signal_unblock(curthread);
+
+	uc_len = __getcontextx_size();
+	uc = alloca(uc_len);
+	getcontext(uc);
+	__fillcontextx2((char *)uc);
 }

Modified: head/lib/libthr/thread/thr_sig.c
==============================================================================
--- head/lib/libthr/thread/thr_sig.c	Mon Aug 10 16:32:47 2015	(r286581)
+++ head/lib/libthr/thread/thr_sig.c	Mon Aug 10 17:02:42 2015	(r286582)
@@ -30,6 +30,7 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/signalvar.h>
+#include <sys/syscall.h>
 #include <signal.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -257,7 +258,7 @@ handle_signal(struct sigaction *actp, in
 	/* reschedule cancellation */
 	check_cancel(curthread, &uc2);
 	errno = err;
-	__sys_sigreturn(&uc2);
+	syscall(SYS_sigreturn, &uc2);
 }
 
 void



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