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