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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to