summaryrefslogtreecommitdiffstats
path: root/sys/fs/devfs/devfs_vfsops.c
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2012-02-23 18:51:24 +0000
committermm <mm@FreeBSD.org>2012-02-23 18:51:24 +0000
commit4825085ea4c115cda3f658f509ee7eac649d4267 (patch)
tree9a2a88cb10722db25dcb45d3c1ae2c34dec88614 /sys/fs/devfs/devfs_vfsops.c
parentda3a5506b851a2db73c9386b1ec92a3eb991e0fd (diff)
downloadFreeBSD-src-4825085ea4c115cda3f658f509ee7eac649d4267.zip
FreeBSD-src-4825085ea4c115cda3f658f509ee7eac649d4267.tar.gz
To improve control over the use of mount(8) inside a jail(8), introduce
a new jail parameter node with the following parameters: allow.mount.devfs: allow mounting the devfs filesystem inside a jail allow.mount.nullfs: allow mounting the nullfs filesystem inside a jail Both parameters are disabled by default (equals the behavior before devfs and nullfs in jails). Administrators have to explicitly allow mounting devfs and nullfs for each jail. The value "-1" of the devfs_ruleset parameter is removed in favor of the new allow setting. Reviewed by: jamie Suggested by: pjd MFC after: 2 weeks
Diffstat (limited to 'sys/fs/devfs/devfs_vfsops.c')
-rw-r--r--sys/fs/devfs/devfs_vfsops.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/sys/fs/devfs/devfs_vfsops.c b/sys/fs/devfs/devfs_vfsops.c
index 9606974..f73b229 100644
--- a/sys/fs/devfs/devfs_vfsops.c
+++ b/sys/fs/devfs/devfs_vfsops.c
@@ -71,7 +71,7 @@ devfs_mount(struct mount *mp)
struct devfs_mount *fmp;
struct vnode *rvp;
struct thread *td = curthread;
- int rsnum;
+ int injail, rsnum;
if (devfs_unr == NULL)
devfs_unr = new_unrhdr(0, INT_MAX, NULL);
@@ -81,7 +81,11 @@ devfs_mount(struct mount *mp)
if (mp->mnt_flag & MNT_ROOTFS)
return (EOPNOTSUPP);
+ if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_DEVFS))
+ return (EPERM);
+
rsnum = 0;
+ injail = jailed(td->td_ucred);
if (mp->mnt_optnew != NULL) {
if (vfs_filteropt(mp->mnt_optnew, devfs_opts))
@@ -89,24 +93,20 @@ devfs_mount(struct mount *mp)
if (vfs_getopt(mp->mnt_optnew, "ruleset", NULL, NULL) == 0 &&
(vfs_scanopt(mp->mnt_optnew, "ruleset", "%d",
- &rsnum) != 1 || rsnum < 0 || rsnum > 65535))
- error = EINVAL;
- }
+ &rsnum) != 1 || rsnum < 0 || rsnum > 65535)) {
+ vfs_mount_error(mp, "%s",
+ "invalid ruleset specification");
+ return (EINVAL);
+ }
- /* jails enforce their ruleset, prison0 has no restrictions */
- if (td->td_ucred->cr_prison->pr_devfs_rsnum != 0) {
- rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum;
- if (rsnum == -1)
+ if (injail && rsnum != 0 &&
+ rsnum != td->td_ucred->cr_prison->pr_devfs_rsnum)
return (EPERM);
- /* check rsnum for sanity, devfs_rsnum is uint16_t */
- if (rsnum < 0 || rsnum > 65535)
- error = EINVAL;
}
- if (error) {
- vfs_mount_error(mp, "%s", "invalid ruleset specification");
- return (error);
- }
+ /* jails enforce their ruleset */
+ if (injail)
+ rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum;
if (mp->mnt_flag & MNT_UPDATE) {
if (rsnum != 0) {
OpenPOWER on IntegriCloud