devfs_vfsops.c (231267) | devfs_vfsops.c (232059) |
---|---|
1/*- 2 * Copyright (c) 1992, 1993, 1995 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 2000 5 * Poul-Henning Kamp. All rights reserved. 6 * 7 * This code is derived from software donated to Berkeley by 8 * Jan-Simon Pendry. --- 17 unchanged lines hidden (view full) --- 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)kernfs_vfsops.c 8.10 (Berkeley) 5/14/95 32 * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vfsops.c 1.36 33 * | 1/*- 2 * Copyright (c) 1992, 1993, 1995 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 2000 5 * Poul-Henning Kamp. All rights reserved. 6 * 7 * This code is derived from software donated to Berkeley by 8 * Jan-Simon Pendry. --- 17 unchanged lines hidden (view full) --- 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)kernfs_vfsops.c 8.10 (Berkeley) 5/14/95 32 * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vfsops.c 1.36 33 * |
34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 231267 2012-02-09 10:22:08Z mm $ | 34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 232059 2012-02-23 18:51:24Z mm $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> 40#include <sys/lock.h> 41#include <sys/malloc.h> 42#include <sys/mount.h> --- 23 unchanged lines hidden (view full) --- 66 */ 67static int 68devfs_mount(struct mount *mp) 69{ 70 int error; 71 struct devfs_mount *fmp; 72 struct vnode *rvp; 73 struct thread *td = curthread; | 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> 40#include <sys/lock.h> 41#include <sys/malloc.h> 42#include <sys/mount.h> --- 23 unchanged lines hidden (view full) --- 66 */ 67static int 68devfs_mount(struct mount *mp) 69{ 70 int error; 71 struct devfs_mount *fmp; 72 struct vnode *rvp; 73 struct thread *td = curthread; |
74 int rsnum; | 74 int injail, rsnum; |
75 76 if (devfs_unr == NULL) 77 devfs_unr = new_unrhdr(0, INT_MAX, NULL); 78 79 error = 0; 80 81 if (mp->mnt_flag & MNT_ROOTFS) 82 return (EOPNOTSUPP); 83 | 75 76 if (devfs_unr == NULL) 77 devfs_unr = new_unrhdr(0, INT_MAX, NULL); 78 79 error = 0; 80 81 if (mp->mnt_flag & MNT_ROOTFS) 82 return (EOPNOTSUPP); 83 |
84 if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_DEVFS)) 85 return (EPERM); 86 |
|
84 rsnum = 0; | 87 rsnum = 0; |
88 injail = jailed(td->td_ucred); |
|
85 86 if (mp->mnt_optnew != NULL) { 87 if (vfs_filteropt(mp->mnt_optnew, devfs_opts)) 88 return (EINVAL); 89 90 if (vfs_getopt(mp->mnt_optnew, "ruleset", NULL, NULL) == 0 && 91 (vfs_scanopt(mp->mnt_optnew, "ruleset", "%d", | 89 90 if (mp->mnt_optnew != NULL) { 91 if (vfs_filteropt(mp->mnt_optnew, devfs_opts)) 92 return (EINVAL); 93 94 if (vfs_getopt(mp->mnt_optnew, "ruleset", NULL, NULL) == 0 && 95 (vfs_scanopt(mp->mnt_optnew, "ruleset", "%d", |
92 &rsnum) != 1 || rsnum < 0 || rsnum > 65535)) 93 error = EINVAL; 94 } | 96 &rsnum) != 1 || rsnum < 0 || rsnum > 65535)) { 97 vfs_mount_error(mp, "%s", 98 "invalid ruleset specification"); 99 return (EINVAL); 100 } |
95 | 101 |
96 /* jails enforce their ruleset, prison0 has no restrictions */ 97 if (td->td_ucred->cr_prison->pr_devfs_rsnum != 0) { 98 rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum; 99 if (rsnum == -1) | 102 if (injail && rsnum != 0 && 103 rsnum != td->td_ucred->cr_prison->pr_devfs_rsnum) |
100 return (EPERM); | 104 return (EPERM); |
101 /* check rsnum for sanity, devfs_rsnum is uint16_t */ 102 if (rsnum < 0 || rsnum > 65535) 103 error = EINVAL; | |
104 } 105 | 105 } 106 |
106 if (error) { 107 vfs_mount_error(mp, "%s", "invalid ruleset specification"); 108 return (error); 109 } | 107 /* jails enforce their ruleset */ 108 if (injail) 109 rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum; |
110 111 if (mp->mnt_flag & MNT_UPDATE) { 112 if (rsnum != 0) { 113 fmp = mp->mnt_data; 114 if (fmp != NULL) { 115 sx_xlock(&fmp->dm_lock); 116 devfs_ruleset_set((devfs_rsnum)rsnum, fmp); 117 devfs_ruleset_apply(fmp); --- 125 unchanged lines hidden --- | 110 111 if (mp->mnt_flag & MNT_UPDATE) { 112 if (rsnum != 0) { 113 fmp = mp->mnt_data; 114 if (fmp != NULL) { 115 sx_xlock(&fmp->dm_lock); 116 devfs_ruleset_set((devfs_rsnum)rsnum, fmp); 117 devfs_ruleset_apply(fmp); --- 125 unchanged lines hidden --- |