summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorjonathan <jonathan@FreeBSD.org>2011-08-16 14:14:56 +0000
committerjonathan <jonathan@FreeBSD.org>2011-08-16 14:14:56 +0000
commita76ca2eae754746b1de94206ff7de76a42bc6bab (patch)
treee1ac53093570fbc2a88500f2e87efee7faf0f821 /sys/kern/sys_generic.c
parent82e7e2a2904eb45b64f219faf9a9e96f6673e433 (diff)
downloadFreeBSD-src-a76ca2eae754746b1de94206ff7de76a42bc6bab.zip
FreeBSD-src-a76ca2eae754746b1de94206ff7de76a42bc6bab.tar.gz
poll(2) implementation for capabilities.
When calling poll(2) on a capability, unwrap first and then poll the underlying object. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 7dc69a6e..6edd4fb 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -1279,11 +1279,17 @@ pollrescan(struct thread *td)
if (si != NULL)
continue;
fp = fdp->fd_ofiles[fd->fd];
+#ifdef CAPABILITIES
+ if ((fp == NULL)
+ || (cap_funwrap(fp, CAP_POLL_EVENT, &fp) != 0)) {
+#else
if (fp == NULL) {
+#endif
fd->revents = POLLNVAL;
n++;
continue;
}
+
/*
* Note: backend also returns POLLHUP and
* POLLERR if appropriate.
@@ -1344,7 +1350,12 @@ pollscan(td, fds, nfd)
fds->revents = 0;
} else {
fp = fdp->fd_ofiles[fds->fd];
+#ifdef CAPABILITIES
+ if ((fp == NULL)
+ || (cap_funwrap(fp, CAP_POLL_EVENT, &fp) != 0)) {
+#else
if (fp == NULL) {
+#endif
fds->revents = POLLNVAL;
n++;
} else {
OpenPOWER on IntegriCloud