PERFORCE change 167145 for review
Robert Watson
rwatson at FreeBSD.org
Sun Aug 9 22:11:58 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167145
Change 167145 by rwatson at rwatson_freebsd_capabilities on 2009/08/09 22:11:44
Some fcntl's need to operate on capabilities, others on the
underlying objects. Refine kern_fcntl() so that the following
operations are on capabilities:
F_DUPFD, F_DUP2FD, F_GETFD, F_SETFD
The following operations require CAP_FCNTL and affect the
underlying file descriptor:
F_GETFL, F_SETFL, F_GETOWN, F_SETOWN
The following operations require CAP_FLOCK and affect the
underlying file descriptor:
F_SETLK_REMOTE, F_SETLKW, F_SETLK, F_GETLK
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#28 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/sys/kern/kern_descrip.c#28 (text+ko) ====
@@ -404,7 +404,7 @@
}
static inline struct file *
-fdtofp(int fd, cap_rights_t rights, struct filedesc *fdp)
+fdtofp(int fd, struct filedesc *fdp)
{
struct file *fp;
@@ -412,13 +412,23 @@
if ((unsigned)fd >= fdp->fd_nfiles ||
(fp = fdp->fd_ofiles[fd]) == NULL)
return (NULL);
+ return (fp);
+}
+
+static inline struct file *
+fdtofp_cap(int fd, cap_rights_t rights, struct filedesc *fdp)
+{
+ struct file *fp;
+ FILEDESC_LOCK_ASSERT(fdp);
+ 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))
+ if (cap_fextract(fp, rights, &fp))
return (NULL);
#endif /* CAPABILITIES */
-
return (fp);
}
@@ -453,7 +463,7 @@
case F_GETFD:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -465,7 +475,7 @@
case F_SETFD:
FILEDESC_XLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_WRITE, fdp)) == NULL) {
+ if ((fp = fdtofp(fd, fdp)) == NULL) {
FILEDESC_XUNLOCK(fdp);
error = EBADF;
break;
@@ -478,7 +488,7 @@
case F_GETFL:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FCNTL, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -489,7 +499,7 @@
case F_SETFL:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_FCHFLAGS, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FCNTL, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -521,7 +531,7 @@
case F_GETOWN:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_READ, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FCNTL, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -536,7 +546,7 @@
case F_SETOWN:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_FCHOWN, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FCNTL, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -562,7 +572,7 @@
case F_SETLK:
do_setlk:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_FLOCK, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FLOCK, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
@@ -657,7 +667,7 @@
case F_GETLK:
FILEDESC_SLOCK(fdp);
- if ((fp = fdtofp(fd, CAP_FLOCK, fdp)) == NULL) {
+ if ((fp = fdtofp_cap(fd, CAP_FLOCK, fdp)) == NULL) {
FILEDESC_SUNLOCK(fdp);
error = EBADF;
break;
More information about the p4-projects
mailing list