Deleted Added
full compact
vfs_mount.c (163606) vfs_mount.c (164033)
1/*-
2 * Copyright (c) 1999-2004 Poul-Henning Kamp
3 * Copyright (c) 1999 Michael Smith
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
6 * (c) UNIX System Laboratories, Inc.
7 * All or some portions of this file are derived from material licensed
8 * to the University of California by American Telephone and Telegraph

--- 21 unchanged lines hidden (view full) ---

30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1999-2004 Poul-Henning Kamp
3 * Copyright (c) 1999 Michael Smith
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
6 * (c) UNIX System Laboratories, Inc.
7 * All or some portions of this file are derived from material licensed
8 * to the University of California by American Telephone and Telegraph

--- 21 unchanged lines hidden (view full) ---

30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/sys/kern/vfs_mount.c 163606 2006-10-22 11:52:19Z rwatson $");
38__FBSDID("$FreeBSD: head/sys/kern/vfs_mount.c 164033 2006-11-06 13:42:10Z rwatson $");
39
40#include <sys/param.h>
41#include <sys/conf.h>
42#include <sys/clock.h>
43#include <sys/jail.h>
44#include <sys/kernel.h>
45#include <sys/libkern.h>
46#include <sys/malloc.h>
47#include <sys/mount.h>
48#include <sys/mutex.h>
49#include <sys/namei.h>
39
40#include <sys/param.h>
41#include <sys/conf.h>
42#include <sys/clock.h>
43#include <sys/jail.h>
44#include <sys/kernel.h>
45#include <sys/libkern.h>
46#include <sys/malloc.h>
47#include <sys/mount.h>
48#include <sys/mutex.h>
49#include <sys/namei.h>
50#include <sys/priv.h>
50#include <sys/proc.h>
51#include <sys/filedesc.h>
52#include <sys/reboot.h>
53#include <sys/syscallsubr.h>
54#include <sys/sysproto.h>
55#include <sys/sx.h>
56#include <sys/sysctl.h>
57#include <sys/sysent.h>

--- 745 unchanged lines hidden (view full) ---

803 * terminating NUL.
804 */
805 if (strlen(fstype) >= MFSNAMELEN || strlen(fspath) >= MNAMELEN)
806 return (ENAMETOOLONG);
807
808 if (jailed(td->td_ucred))
809 return (EPERM);
810 if (usermount == 0) {
51#include <sys/proc.h>
52#include <sys/filedesc.h>
53#include <sys/reboot.h>
54#include <sys/syscallsubr.h>
55#include <sys/sysproto.h>
56#include <sys/sx.h>
57#include <sys/sysctl.h>
58#include <sys/sysent.h>

--- 745 unchanged lines hidden (view full) ---

804 * terminating NUL.
805 */
806 if (strlen(fstype) >= MFSNAMELEN || strlen(fspath) >= MNAMELEN)
807 return (ENAMETOOLONG);
808
809 if (jailed(td->td_ucred))
810 return (EPERM);
811 if (usermount == 0) {
811 if ((error = suser(td)) != 0)
812 if ((error = priv_check(td, PRIV_VFS_MOUNT)) != 0)
812 return (error);
813 }
814
815 /*
816 * Do not allow NFS export or MNT_SUIDDIR by unprivileged users.
817 */
813 return (error);
814 }
815
816 /*
817 * Do not allow NFS export or MNT_SUIDDIR by unprivileged users.
818 */
818 if (fsflags & (MNT_EXPORTED | MNT_SUIDDIR)) {
819 if ((error = suser(td)) != 0)
819 if (fsflags & MNT_EXPORTED) {
820 error = priv_check(td, PRIV_VFS_MOUNT_EXPORTED);
821 if (error)
820 return (error);
821 }
822 return (error);
823 }
824 if (fsflags & MNT_SUIDDIR) {
825 error = priv_check(td, PRIV_VFS_MOUNT_SUIDDIR);
826 if (error)
827 return (error);
828
829 }
822 /*
830 /*
823 * Silently enforce MNT_NOSUID and MNT_USER for
824 * unprivileged users.
831 * Silently enforce MNT_NOSUID and MNT_USER for unprivileged users.
825 */
832 */
826 if (suser(td) != 0)
827 fsflags |= MNT_NOSUID | MNT_USER;
833 if ((fsflags & (MNT_NOSUID | MNT_USER)) != (MNT_NOSUID | MNT_USER)) {
834 if (priv_check(td, PRIV_VFS_MOUNT_NONUSER) != 0)
835 fsflags |= MNT_NOSUID | MNT_USER;
836 }
828
829 /* Load KLDs before we lock the covered vnode to avoid reversals. */
830 vfsp = NULL;
831 if ((fsflags & MNT_UPDATE) == 0) {
832 /* Don't try to load KLDs if we're mounting the root. */
833 if (fsflags & MNT_ROOTFS)
834 vfsp = vfs_byname(fstype);
835 else

--- 65 unchanged lines hidden (view full) ---

901 * onto which we are attempting to mount.
902 */
903 error = VOP_GETATTR(vp, &va, td->td_ucred, td);
904 if (error) {
905 vput(vp);
906 return (error);
907 }
908 if (va.va_uid != td->td_ucred->cr_uid) {
837
838 /* Load KLDs before we lock the covered vnode to avoid reversals. */
839 vfsp = NULL;
840 if ((fsflags & MNT_UPDATE) == 0) {
841 /* Don't try to load KLDs if we're mounting the root. */
842 if (fsflags & MNT_ROOTFS)
843 vfsp = vfs_byname(fstype);
844 else

--- 65 unchanged lines hidden (view full) ---

910 * onto which we are attempting to mount.
911 */
912 error = VOP_GETATTR(vp, &va, td->td_ucred, td);
913 if (error) {
914 vput(vp);
915 return (error);
916 }
917 if (va.va_uid != td->td_ucred->cr_uid) {
909 if ((error = suser(td)) != 0) {
918 error = priv_check_cred(td->td_ucred, PRIV_VFS_ADMIN,
919 SUSER_ALLOWJAIL);
920 if (error) {
910 vput(vp);
911 return (error);
912 }
913 }
914 error = vinvalbuf(vp, V_SAVE, td, 0, 0);
915 if (error != 0) {
916 vput(vp);
917 return (error);

--- 155 unchanged lines hidden (view full) ---

1073{
1074 struct mount *mp;
1075 char *pathbuf;
1076 int error, id0, id1;
1077
1078 if (jailed(td->td_ucred))
1079 return (EPERM);
1080 if (usermount == 0) {
921 vput(vp);
922 return (error);
923 }
924 }
925 error = vinvalbuf(vp, V_SAVE, td, 0, 0);
926 if (error != 0) {
927 vput(vp);
928 return (error);

--- 155 unchanged lines hidden (view full) ---

1084{
1085 struct mount *mp;
1086 char *pathbuf;
1087 int error, id0, id1;
1088
1089 if (jailed(td->td_ucred))
1090 return (EPERM);
1091 if (usermount == 0) {
1081 if ((error = suser(td)) != 0)
1092 error = priv_check(td, PRIV_VFS_UNMOUNT);
1093 if (error)
1082 return (error);
1083 }
1084
1085 pathbuf = malloc(MNAMELEN, M_TEMP, M_WAITOK);
1086 error = copyinstr(uap->path, pathbuf, MNAMELEN, NULL);
1087 if (error) {
1088 free(pathbuf, M_TEMP);
1089 return (error);

--- 1079 unchanged lines hidden ---
1094 return (error);
1095 }
1096
1097 pathbuf = malloc(MNAMELEN, M_TEMP, M_WAITOK);
1098 error = copyinstr(uap->path, pathbuf, MNAMELEN, NULL);
1099 if (error) {
1100 free(pathbuf, M_TEMP);
1101 return (error);

--- 1079 unchanged lines hidden ---