svn commit: r258181 - in head: sys/kern sys/sys usr.bin/procstat
Pawel Jakub Dawidek
pjd at FreeBSD.org
Fri Nov 15 19:55:37 UTC 2013
Author: pjd
Date: Fri Nov 15 19:55:35 2013
New Revision: 258181
URL: http://svnweb.freebsd.org/changeset/base/258181
Log:
Replace CAP_POLL_EVENT and CAP_POST_EVENT capability rights (which I had
a very hard time to fully understand) with much more intuitive rights:
CAP_EVENT - when set on descriptor, the descriptor can be monitored
with syscalls like select(2), poll(2), kevent(2).
CAP_KQUEUE_EVENT - When set on a kqueue descriptor, the kevent(2)
syscall can be called on this kqueue to with the eventlist
argument set to non-NULL value; in other words the given
kqueue descriptor can be used to monitor other descriptors.
CAP_KQUEUE_CHANGE - When set on a kqueue descriptor, the kevent(2)
syscall can be called on this kqueue to with the changelist
argument set to non-NULL value; in other words it allows to
modify events monitored with the given kqueue descriptor.
Add alias CAP_KQUEUE, which allows for both CAP_KQUEUE_EVENT and
CAP_KQUEUE_CHANGE.
Add backward compatibility define CAP_POLL_EVENT which is equal to CAP_EVENT.
Sponsored by: The FreeBSD Foundation
MFC after: 3 days
Modified:
head/sys/kern/kern_event.c
head/sys/kern/sys_generic.c
head/sys/kern/uipc_mqueue.c
head/sys/sys/capability.h
head/usr.bin/procstat/procstat_files.c
Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c Fri Nov 15 19:01:29 2013 (r258180)
+++ head/sys/kern/kern_event.c Fri Nov 15 19:55:35 2013 (r258181)
@@ -855,10 +855,17 @@ kern_kevent(struct thread *td, int fd, i
cap_rights_t rights;
int i, n, nerrors, error;
- error = fget(td, fd, cap_rights_init(&rights, CAP_POST_EVENT), &fp);
+ cap_rights_init(&rights);
+ if (nchanges > 0)
+ cap_rights_set(&rights, CAP_KQUEUE_CHANGE);
+ if (nevents > 0)
+ cap_rights_set(&rights, CAP_KQUEUE_EVENT);
+ error = fget(td, fd, &rights, &fp);
if (error != 0)
return (error);
- if ((error = kqueue_acquire(fp, &kq)) != 0)
+
+ error = kqueue_acquire(fp, &kq);
+ if (error != 0)
goto done_norel;
nerrors = 0;
@@ -1015,7 +1022,7 @@ findkn:
if (fops->f_isfd) {
KASSERT(td != NULL, ("td is NULL"));
error = fget(td, kev->ident,
- cap_rights_init(&rights, CAP_POLL_EVENT), &fp);
+ cap_rights_init(&rights, CAP_EVENT), &fp);
if (error)
goto done;
@@ -2301,7 +2308,7 @@ kqfd_register(int fd, struct kevent *kev
cap_rights_t rights;
int error;
- error = fget(td, fd, cap_rights_init(&rights, CAP_POST_EVENT), &fp);
+ error = fget(td, fd, cap_rights_init(&rights, CAP_KQUEUE_CHANGE), &fp);
if (error != 0)
return (error);
if ((error = kqueue_acquire(fp, &kq)) != 0)
Modified: head/sys/kern/sys_generic.c
==============================================================================
--- head/sys/kern/sys_generic.c Fri Nov 15 19:01:29 2013 (r258180)
+++ head/sys/kern/sys_generic.c Fri Nov 15 19:55:35 2013 (r258181)
@@ -1195,8 +1195,9 @@ getselfd_cap(struct filedesc *fdp, int f
{
cap_rights_t rights;
- return (fget_unlocked(fdp, fd, cap_rights_init(&rights, CAP_POLL_EVENT),
- 0, fpp, NULL));
+ cap_rights_init(&rights, CAP_EVENT);
+
+ return (fget_unlocked(fdp, fd, &rights, 0, fpp, NULL));
}
/*
@@ -1392,7 +1393,7 @@ pollrescan(struct thread *td)
#ifdef CAPABILITIES
if (fp == NULL ||
cap_check(cap_rights(fdp, fd->fd),
- cap_rights_init(&rights, CAP_POLL_EVENT)) != 0)
+ cap_rights_init(&rights, CAP_EVENT)) != 0)
#else
if (fp == NULL)
#endif
@@ -1467,7 +1468,7 @@ pollscan(td, fds, nfd)
#ifdef CAPABILITIES
if (fp == NULL ||
cap_check(cap_rights(fdp, fds->fd),
- cap_rights_init(&rights, CAP_POLL_EVENT)) != 0)
+ cap_rights_init(&rights, CAP_EVENT)) != 0)
#else
if (fp == NULL)
#endif
Modified: head/sys/kern/uipc_mqueue.c
==============================================================================
--- head/sys/kern/uipc_mqueue.c Fri Nov 15 19:01:29 2013 (r258180)
+++ head/sys/kern/uipc_mqueue.c Fri Nov 15 19:55:35 2013 (r258181)
@@ -2119,7 +2119,7 @@ getmq(struct thread *td, int fd, struct
{
cap_rights_t rights;
- return _getmq(td, fd, cap_rights_init(&rights, CAP_POLL_EVENT), fget,
+ return _getmq(td, fd, cap_rights_init(&rights, CAP_EVENT), fget,
fpp, ppn, pmq);
}
@@ -2282,7 +2282,7 @@ again:
}
#ifdef CAPABILITIES
error = cap_check(cap_rights(fdp, mqd),
- cap_rights_init(&rights, CAP_POLL_EVENT));
+ cap_rights_init(&rights, CAP_EVENT));
if (error) {
FILEDESC_SUNLOCK(fdp);
goto out;
Modified: head/sys/sys/capability.h
==============================================================================
--- head/sys/sys/capability.h Fri Nov 15 19:01:29 2013 (r258180)
+++ head/sys/sys/capability.h Fri Nov 15 19:55:35 2013 (r258181)
@@ -226,9 +226,10 @@
#define CAP_SEM_POST CAPRIGHT(1, 0x0000000000000008ULL)
#define CAP_SEM_WAIT CAPRIGHT(1, 0x0000000000000010ULL)
-/* kqueue events. */
-#define CAP_POLL_EVENT CAPRIGHT(1, 0x0000000000000020ULL)
-#define CAP_POST_EVENT CAPRIGHT(1, 0x0000000000000040ULL)
+/* Allows select(2) and poll(2) on descriptor. */
+#define CAP_EVENT CAPRIGHT(1, 0x0000000000000020ULL)
+/* Allows for kevent(2) on kqueue descriptor with eventlist != NULL. */
+#define CAP_KQUEUE_EVENT CAPRIGHT(1, 0x0000000000000040ULL)
/* Strange and powerful rights that should not be given lightly. */
/* Allows for ioctl(2). */
@@ -263,14 +264,22 @@
/* Allows for acl_set_fd(3) and acl_set_fd_np(3). */
#define CAP_ACL_SET CAPRIGHT(1, 0x0000000000080000ULL)
+/* Allows for kevent(2) on kqueue descriptor with changelist != NULL. */
+#define CAP_KQUEUE_CHANGE CAPRIGHT(1, 0x0000000000100000ULL)
+
+#define CAP_KQUEUE (CAP_KQUEUE_EVENT | CAP_KQUEUE_CHANGE)
+
/* All used bits for index 1. */
-#define CAP_ALL1 CAPRIGHT(1, 0x00000000000FFFFFULL)
+#define CAP_ALL1 CAPRIGHT(1, 0x00000000001FFFFFULL)
/* Available bits for index 1. */
-#define CAP_UNUSED1_21 CAPRIGHT(1, 0x0000000000100000ULL)
+#define CAP_UNUSED1_22 CAPRIGHT(1, 0x0000000000200000ULL)
/* ... */
#define CAP_UNUSED1_57 CAPRIGHT(1, 0x0100000000000000ULL)
+/* Backward compatibility. */
+#define CAP_POLL_EVENT CAP_EVENT
+
#define CAP_ALL(rights) do { \
(rights)->cr_rights[0] = \
((uint64_t)CAP_RIGHTS_VERSION << 62) | CAP_ALL0; \
Modified: head/usr.bin/procstat/procstat_files.c
==============================================================================
--- head/usr.bin/procstat/procstat_files.c Fri Nov 15 19:01:29 2013 (r258180)
+++ head/usr.bin/procstat/procstat_files.c Fri Nov 15 19:55:35 2013 (r258181)
@@ -203,8 +203,9 @@ static struct cap_desc {
{ CAP_SEM_WAIT, "sw" },
/* Event monitoring and posting. */
- { CAP_POLL_EVENT, "po" },
- { CAP_POST_EVENT, "ev" },
+ { CAP_EVENT, "ev" },
+ { CAP_KQUEUE_EVENT, "ke" },
+ { CAP_KQUEUE_CHANGE, "kc" },
/* Strange and powerful rights that should not be given lightly. */
{ CAP_IOCTL, "io" },
More information about the svn-src-all
mailing list