diff options
author | jonathan <jonathan@FreeBSD.org> | 2011-08-16 14:14:56 +0000 |
---|---|---|
committer | jonathan <jonathan@FreeBSD.org> | 2011-08-16 14:14:56 +0000 |
commit | a76ca2eae754746b1de94206ff7de76a42bc6bab (patch) | |
tree | e1ac53093570fbc2a88500f2e87efee7faf0f821 /sys/kern | |
parent | 82e7e2a2904eb45b64f219faf9a9e96f6673e433 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/sys_generic.c | 11 |
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 { |