Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Feb 2017 19:54:17 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r314311 - head/sys/compat/linux
Message-ID:  <201702261954.v1QJsHl8077117@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Sun Feb 26 19:54:17 2017
New Revision: 314311
URL: https://svnweb.freebsd.org/changeset/base/314311

Log:
  Restore signal mask in epoll_pwait.
  
  MFC after:	1 month

Modified:
  head/sys/compat/linux/linux_event.c

Modified: head/sys/compat/linux/linux_event.c
==============================================================================
--- head/sys/compat/linux/linux_event.c	Sun Feb 26 19:54:02 2017	(r314310)
+++ head/sys/compat/linux/linux_event.c	Sun Feb 26 19:54:17 2017	(r314311)
@@ -530,23 +530,32 @@ static int
 linux_epoll_wait_common(struct thread *td, int epfd, struct epoll_event *events,
     int maxevents, int timeout, sigset_t *uset)
 {
-	struct file *epfp;
-	struct timespec ts, *tsp;
-	cap_rights_t rights;
 	struct epoll_copyout_args coargs;
 	struct kevent_copyops k_ops = { &coargs,
 					epoll_kev_copyout,
 					NULL};
+	struct timespec ts, *tsp;
+	cap_rights_t rights;
+	struct file *epfp;
+	sigset_t omask;
 	int error;
 
 	if (maxevents <= 0 || maxevents > LINUX_MAX_EVENTS)
 		return (EINVAL);
 
+	error = fget(td, epfd,
+	    cap_rights_init(&rights, CAP_KQUEUE_EVENT), &epfp);
+	if (error != 0)
+		return (error);
+	if (epfp->f_type != DTYPE_KQUEUE) {
+		error = EINVAL;
+		goto leave1;
+	}
 	if (uset != NULL) {
 		error = kern_sigprocmask(td, SIG_SETMASK, uset,
-		    &td->td_oldsigmask, 0);
+		    &omask, 0);
 		if (error != 0)
-			return (error);
+			goto leave1;
 		td->td_pflags |= TDP_OLDMASK;
 		/*
 		 * Make sure that ast() is called on return to
@@ -558,14 +567,6 @@ linux_epoll_wait_common(struct thread *t
 		thread_unlock(td);
 	}
 
-	error = fget(td, epfd,
-	    cap_rights_init(&rights, CAP_KQUEUE_EVENT), &epfp);
-	if (error != 0)
-		return (error);
-	if (epfp->f_type != DTYPE_KQUEUE) {
-		error = EINVAL;
-		goto leave;
-	}
 
 	coargs.leventlist = events;
 	coargs.p = td->td_proc;
@@ -575,7 +576,7 @@ linux_epoll_wait_common(struct thread *t
 	if (timeout != -1) {
 		if (timeout < 0) {
 			error = EINVAL;
-			goto leave;
+			goto leave0;
 		}
 		/* Convert from milliseconds to timespec. */
 		ts.tv_sec = timeout / 1000;
@@ -595,7 +596,12 @@ linux_epoll_wait_common(struct thread *t
 	 */
 	if (error == 0)
 		td->td_retval[0] = coargs.count;
-leave:
+
+leave0:
+	if (uset != NULL)
+		error = kern_sigprocmask(td, SIG_SETMASK, &omask,
+		    NULL, 0);
+leave1:
 	fdrop(epfp, td);
 	return (error);
 }



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