summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorPatrick Mooney <pmooney@pfmooney.com>2016-03-23 19:35:31 +0000
committerPatrick Mooney <pmooney@pfmooney.com>2016-03-23 20:14:06 +0000
commit40afa9260fa0e89237ef45a37b8b407c57f49f39 (patch)
treeb03c14d864a80875d03f57e22e4ed8ebce38cb37 /usr/src
parentfcc3d074e6a2ad9529ce014e16d99720f33a053d (diff)
downloadillumos-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.c17
-rw-r--r--usr/src/uts/common/io/devpoll.c20
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);