svn commit: r316296 - stable/11/sys/compat/linux

Dmitry Chagin dchagin at FreeBSD.org
Thu Mar 30 20:05:17 UTC 2017


Author: dchagin
Date: Thu Mar 30 20:05:16 2017
New Revision: 316296
URL: https://svnweb.freebsd.org/changeset/base/316296

Log:
  MFC r314311:
  
  Restore signal mask in epoll_pwait.

Modified:
  stable/11/sys/compat/linux/linux_event.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/compat/linux/linux_event.c
==============================================================================
--- stable/11/sys/compat/linux/linux_event.c	Thu Mar 30 20:04:28 2017	(r316295)
+++ stable/11/sys/compat/linux/linux_event.c	Thu Mar 30 20:05:16 2017	(r316296)
@@ -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);
 }


More information about the svn-src-all mailing list