summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2009-10-01 17:22:03 +0000
committertrasz <trasz@FreeBSD.org>2009-10-01 17:22:03 +0000
commitd5661d631d28fee99ac0a8758c56535ac2c9b01b (patch)
treef2b6e2088bb410fc3239074022c9d70c3c255caf
parentc6a1085feffa5fcd9040272aeae30e7f2466f754 (diff)
downloadFreeBSD-src-d5661d631d28fee99ac0a8758c56535ac2c9b01b.zip
FreeBSD-src-d5661d631d28fee99ac0a8758c56535ac2c9b01b.tar.gz
Provide default implementation for VOP_ACCESS(9), so that filesystems which
want to provide VOP_ACCESSX(9) don't have to implement both. Note that this commit makes implementation of either of these two mandatory. Reviewed by: kib
-rw-r--r--sys/fs/fifofs/fifo_vnops.c1
-rw-r--r--sys/kern/subr_acl_posix1e.c3
-rw-r--r--sys/kern/vfs_default.c15
-rw-r--r--sys/kern/vfs_subr.c3
-rw-r--r--sys/sys/vnode.h1
5 files changed, 22 insertions, 1 deletions
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 6dea11c..c930d92 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -119,7 +119,6 @@ static struct filterops fifo_notsup_filtops = {
struct vop_vector fifo_specops = {
.vop_default = &default_vnodeops,
- .vop_access = VOP_EBADF,
.vop_advlock = fifo_advlock,
.vop_close = fifo_close,
.vop_create = VOP_PANIC,
diff --git a/sys/kern/subr_acl_posix1e.c b/sys/kern/subr_acl_posix1e.c
index e0016e7..9690580 100644
--- a/sys/kern/subr_acl_posix1e.c
+++ b/sys/kern/subr_acl_posix1e.c
@@ -61,6 +61,9 @@ vaccess_acl_posix1e(enum vtype type, uid_t file_uid, gid_t file_gid,
accmode_t acl_mask_granted;
int group_matched, i;
+ KASSERT((accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | VAPPEND)) == 0,
+ ("invalid bit in accmode"));
+
/*
* Look for a normal, non-privileged way to access the file/directory
* as requested. If it exists, go with that. Otherwise, attempt to
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 86ab01e..b80d03d 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -83,12 +83,17 @@ static int dirent_exists(struct vnode *vp, const char *dirname,
*
* If there is no specific entry here, we will return EOPNOTSUPP.
*
+ * Note that every filesystem has to implement either vop_access
+ * or vop_accessx; failing to do so will result in immediate crash
+ * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(),
+ * which calls vop_stdaccess() etc.
*/
struct vop_vector default_vnodeops = {
.vop_default = NULL,
.vop_bypass = VOP_EOPNOTSUPP,
+ .vop_access = vop_stdaccess,
.vop_accessx = vop_stdaccessx,
.vop_advlock = vop_stdadvlock,
.vop_advlockasync = vop_stdadvlockasync,
@@ -326,6 +331,16 @@ out:
}
int
+vop_stdaccess(struct vop_access_args *ap)
+{
+
+ KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN |
+ VAPPEND)) == 0, ("invalid bit in accmode"));
+
+ return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td));
+}
+
+int
vop_stdaccessx(struct vop_accessx_args *ap)
{
int error;
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index c40dad1..d92555f 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -3520,6 +3520,9 @@ vaccess(enum vtype type, mode_t file_mode, uid_t file_uid, gid_t file_gid,
accmode_t dac_granted;
accmode_t priv_granted;
+ KASSERT((accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | VAPPEND)) == 0,
+ ("invalid bit in accmode"));
+
/*
* Look for a normal, non-privileged way to access the file/directory
* as requested. If it exists, go with that.
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index dffbf9a..b38c1d0 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -685,6 +685,7 @@ int vop_stdlock(struct vop_lock1_args *);
int vop_stdputpages(struct vop_putpages_args *);
int vop_stdunlock(struct vop_unlock_args *);
int vop_nopoll(struct vop_poll_args *);
+int vop_stdaccess(struct vop_access_args *ap);
int vop_stdaccessx(struct vop_accessx_args *ap);
int vop_stdadvlock(struct vop_advlock_args *ap);
int vop_stdadvlockasync(struct vop_advlockasync_args *ap);
OpenPOWER on IntegriCloud