PERFORCE change 166550 for review
Jonathan Anderson
jona at FreeBSD.org
Sat Jul 25 11:23:36 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166550
Change 166550 by jona at jona-trustedbsd-belle-vmware on 2009/07/25 11:22:58
This seems to be the right place to unwrap capability file structs
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#26 edit
.. //depot/projects/trustedbsd/capabilities/src/sys/sys/file.h#14 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#26 (text+ko) ====
@@ -404,7 +404,7 @@
}
static inline struct file *
-fdtofp(int fd, struct filedesc *fdp)
+fdtofp(int fd, cap_rights_t rights, struct filedesc *fdp)
{
struct file *fp;
@@ -412,6 +412,13 @@
if ((unsigned)fd >= fdp->fd_nfiles ||
(fp = fdp->fd_ofiles[fd]) == NULL)
return (NULL);
+
+#ifdef CAPABILITIES
+ if (fp->f_type == DTYPE_CAPABILITY)
+ if(cap_fextract(fp, rights, &fp))
+ return (NULL);
+#endif /* CAPABILITIES */
+
return (fp);
}
@@ -446,7 +453,7 @@
case F_GETFD:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -458,7 +465,7 @@
case F_SETFD:
FILEDESC_XLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_WRITE, fdp)) == NULL) {
FILEDESC_XUNLOCK(fdp);
error = EBADF;
break;
@@ -471,7 +478,7 @@
case F_GETFL:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -482,7 +489,7 @@
case F_SETFL:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_FCHFLAGS, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -514,7 +521,7 @@
case F_GETOWN:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -529,7 +536,7 @@
case F_SETOWN:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_FCHOWN, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -555,7 +562,7 @@
case F_SETLK:
do_setlk:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_FLOCK, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -650,7 +657,7 @@
case F_GETLK:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, CAP_FLOCK, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
==== //depot/projects/trustedbsd/capabilities/src/sys/sys/file.h#14 (text+ko) ====
@@ -44,10 +44,6 @@
#include <sys/_lock.h>
#include <sys/_mutex.h>
-#ifdef CAPABILITIES
-#include <sys/capability.h>
-#endif /* CAPABILITIES */
-
struct stat;
struct thread;
struct uio;
@@ -276,20 +272,7 @@
struct ucred *active_cred;
struct thread *td;
{
- struct file *p = fp;
-
-#ifdef CAPABILITIES
- int error;
-
- if (fp->f_type == DTYPE_CAPABILITY)
- {
- error = cap_fextract(fp, CAP_IOCTL, &p);
- if (error)
- return error;
- }
-#endif /* CAPABILITIES */
-
- return ((*p->f_ops->fo_ioctl)(p, com, data, active_cred, td));
+ return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td));
}
static __inline int
More information about the p4-projects
mailing list