diff options
| author | Patrick Mooney <pmooney@pfmooney.com> | 2016-03-23 19:35:31 +0000 |
|---|---|---|
| committer | Patrick Mooney <pmooney@pfmooney.com> | 2016-03-23 20:14:06 +0000 |
| commit | 40afa9260fa0e89237ef45a37b8b407c57f49f39 (patch) | |
| tree | b03c14d864a80875d03f57e22e4ed8ebce38cb37 /usr/src | |
| parent | fcc3d074e6a2ad9529ce014e16d99720f33a053d (diff) | |
| download | illumos-joyent-40afa9260fa0e89237ef45a37b8b407c57f49f39.tar.gz | |
OS-5260 lxbrand epoll_pwait needs sigset translation
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/brand/lx/syscall/lx_epoll.c | 17 | ||||
| -rw-r--r-- | usr/src/uts/common/io/devpoll.c | 20 |
2 files changed, 29 insertions, 8 deletions
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_epoll.c b/usr/src/uts/common/brand/lx/syscall/lx_epoll.c index 2f3d3131ac..62a0eccf4b 100644 --- a/usr/src/uts/common/brand/lx/syscall/lx_epoll.c +++ b/usr/src/uts/common/brand/lx/syscall/lx_epoll.c @@ -10,7 +10,7 @@ */ /* - * Copyright 2015 Joyent, Inc. + * Copyright 2016 Joyent, Inc. */ #include <sys/types.h> @@ -29,6 +29,7 @@ #include <sys/vnode.h> #include <sys/lx_brand.h> #include <sys/lx_types.h> +#include <sys/lx_signal.h> static major_t devpoll_major = 0; @@ -232,6 +233,7 @@ lx_epoll_pwait(int fd, void *events, int maxevents, int timeout, void *sigmask) struct dvpoll arg; file_t *fp; int rv = 0, error, flag; + k_sigset_t ksig; if (maxevents <= 0) { return (set_errno(EINVAL)); @@ -242,11 +244,22 @@ lx_epoll_pwait(int fd, void *events, int maxevents, int timeout, void *sigmask) releasef(fd); return (set_errno(EINVAL)); } + if (sigmask != NULL) { + lx_sigset_t lsig; + + if (copyin(sigmask, &lsig, sizeof (lsig)) != 0) { + releasef(fd); + return (set_errno(EFAULT)); + } + lx_ltos_sigset(&lsig, &ksig); + arg.dp_setp = (sigset_t *)&ksig; + } else { + arg.dp_setp = NULL; + } arg.dp_nfds = maxevents; arg.dp_timeout = timeout; arg.dp_fds = (pollfd_t *)events; - arg.dp_setp = (sigset_t *)sigmask; flag = fp->f_flag | DATAMODEL_NATIVE | FKIOCTL; error = VOP_IOCTL(fp->f_vnode, DP_PPOLL, (uintptr_t)&arg, flag, fp->f_cred, &rv, NULL); diff --git a/usr/src/uts/common/io/devpoll.c b/usr/src/uts/common/io/devpoll.c index 8c63043d00..f8d9f1cff8 100644 --- a/usr/src/uts/common/io/devpoll.c +++ b/usr/src/uts/common/io/devpoll.c @@ -1123,14 +1123,18 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) void *setp = STRUCT_FGETP(dvpoll, dp_setp); if (setp != NULL) { - if (copyin(setp, &set, sizeof (set))) { - DP_REFRELE(dpep); - return (EFAULT); + if ((mode & FKIOCTL) != 0) { + /* Use the signal set directly */ + ksetp = (k_sigset_t *)setp; + } else { + if (copyin(setp, &set, sizeof (set))) { + DP_REFRELE(dpep); + return (EFAULT); + } + sigutok(&set, &kset); + ksetp = &kset; } - sigutok(&set, &kset); - ksetp = &kset; - mutex_enter(&p->p_lock); schedctl_finish_sigblock(t); lwp->lwp_sigoldmask = t->t_hold; @@ -1279,6 +1283,10 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) DP_SIGMASK_RESTORE(ksetp); if (error == 0 && fdcnt > 0) { + /* + * It should be noted that FKIOCTL does not influence + * the copyout (vs bcopy) of dp_fds at this time. + */ if (copyout(ps->ps_dpbuf, STRUCT_FGETP(dvpoll, dp_fds), fdcnt * fdsize)) { DP_REFRELE(dpep); |
