Export capability information via sysctls.

When reporting on a capability, flag the fact that it is a capability,
but also unwrap to report all of the usual information about the
underlying file.

Approved by: re (kib), mentor (rwatson)
Sponsored by: Google Inc
This commit is contained in:
Jonathan Anderson 2011-07-20 09:53:35 +00:00
parent 2168aaa506
commit c30b9b5169
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=224225
2 changed files with 37 additions and 1 deletions

View File

@ -2946,6 +2946,22 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS)
so = NULL;
tp = NULL;
kif->kf_fd = i;
#ifdef CAPABILITIES
/*
* When reporting a capability, most fields will be from the
* underlying object, but do mark as a capability. With
* ofiledesc, we don't have a field to export the cap_rights_t,
* but we do with the new filedesc.
*/
if (fp->f_type == DTYPE_CAPABILITY) {
kif->kf_flags |= KF_FLAG_CAPABILITY;
(void)cap_funwrap(fp, 0, &fp);
}
#else
KASSERT(fp->f_type != DTYPE_CAPABILITY,
("sysctl_kern_proc_ofiledesc: saw capability"));
#endif
switch (fp->f_type) {
case DTYPE_VNODE:
kif->kf_type = KF_TYPE_VNODE;
@ -3262,6 +3278,22 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER_ARGS)
if ((fp = fdp->fd_ofiles[i]) == NULL)
continue;
data = NULL;
#ifdef CAPABILITIES
/*
* When reporting a capability, most fields will be from the
* underlying object, but do mark as a capability and export
* the capability rights mask.
*/
if (fp->f_type == DTYPE_CAPABILITY) {
kif->kf_flags |= KF_FLAG_CAPABILITY;
kif->kf_cap_rights = cap_rights(fp);
(void)cap_funwrap(fp, 0, &fp);
}
#else /* !CAPABILITIES */
KASSERT(fp->f_type != DTYPE_CAPABILITY,
("sysctl_kern_proc_filedesc: saw capability"));
#endif
switch (fp->f_type) {
case DTYPE_VNODE:
type = KF_TYPE_VNODE;

View File

@ -251,6 +251,7 @@ struct user {
#define KF_TYPE_SHM 8
#define KF_TYPE_SEM 9
#define KF_TYPE_PTS 10
/* no KF_TYPE_CAPABILITY (11), since capabilities wrap other file objects */
#define KF_TYPE_UNKNOWN 255
#define KF_VTYPE_VNON 0
@ -286,6 +287,7 @@ struct user {
#define KF_FLAG_TRUNC 0x00001000
#define KF_FLAG_EXCL 0x00002000
#define KF_FLAG_EXEC 0x00004000
#define KF_FLAG_CAPABILITY 0x00008000
/*
* Old format. Has variable hidden padding due to alignment.
@ -378,7 +380,9 @@ struct kinfo_file {
} kf_un;
uint16_t kf_status; /* Status flags. */
uint16_t kf_pad1; /* Round to 32 bit alignment. */
int _kf_ispare[7]; /* Space for more stuff. */
int _kf_ispare0; /* Space for more stuff. */
cap_rights_t kf_cap_rights; /* Capability rights. */
int _kf_ispare[4]; /* Space for more stuff. */
/* Truncated before copyout in sysctl */
char kf_path[PATH_MAX]; /* Path to file, if any. */
};