priv: Reduce some uses of PRISON_ROOT
authorMichael Neumann <mneumann@ntecs.de>
Thu, 25 Jun 2009 20:24:25 +0000 (22:24 +0200)
committerMichael Neumann <mneumann@ntecs.de>
Thu, 25 Jun 2009 20:24:25 +0000 (22:24 +0200)
Move decision whether the privilege is allowed or not into function
prison_priv_check().

sys/kern/kern_jail.c
sys/kern/kern_plimit.c
sys/kern/kern_prot.c
sys/kern/kern_sysctl.c
sys/kern/vfs_helper.c
sys/kern/vfs_syscalls.c

index aa79120..a89fb9c 100644 (file)
@@ -669,5 +669,33 @@ prison_priv_check(struct ucred *cred, int priv)
        if (!jailed(cred))
                return (0);
 
-       return (EPERM);
+       switch (priv) {
+       case PRIV_CRED_SETUID:
+       case PRIV_CRED_SETEUID:
+       case PRIV_CRED_SETGID:
+       case PRIV_CRED_SETEGID:
+       case PRIV_CRED_SETGROUPS:
+       case PRIV_CRED_SETREUID:
+       case PRIV_CRED_SETREGID:
+       case PRIV_CRED_SETRESUID:
+       case PRIV_CRED_SETRESGID:
+
+       case PRIV_VFS_SYSFLAGS:
+       case PRIV_VFS_CHOWN:
+       case PRIV_VFS_CHROOT:
+       case PRIV_VFS_MKNOD_BAD:
+       case PRIV_VFS_MKNOD_WHT:
+       case PRIV_VFS_MKNOD_DIR:
+
+       case PRIV_PROC_SETRLIMIT:
+       case PRIV_PROC_SETLOGIN:
+
+       case PRIV_SYSCTL_WRITEJAIL:
+
+               return (0);
+
+       default:
+
+               return (EPERM);
+       }
 }
index cff3701..c882b7e 100644 (file)
@@ -347,8 +347,8 @@ kern_setrlimit(u_int which, struct rlimit *limp)
         if (limp->rlim_cur > alimp->rlim_max ||
             limp->rlim_max > alimp->rlim_max) {
                spin_unlock_rd(&limit->p_spin);
-                if ((error = priv_check_cred(p->p_ucred, PRIV_PROC_SETRLIMIT,
-                                            PRISON_ROOT)))
+                error = priv_check_cred(p->p_ucred, PRIV_PROC_SETRLIMIT, 0);
+                if (error)
                         return (error);
        } else {
                spin_unlock_rd(&limit->p_spin);
index fc573e8..1ddff29 100644 (file)
@@ -353,7 +353,7 @@ sys_setuid(struct setuid_args *uap)
 #ifdef POSIX_APPENDIX_B_4_2_2  /* Use BSD-compat clause from B.4.2.2 */
            uid != cr->cr_uid &&        /* allow setuid(geteuid()) */
 #endif
-           (error = priv_check_cred(cr, PRIV_CRED_SETUID, PRISON_ROOT)))
+           (error = priv_check_cred(cr, PRIV_CRED_SETUID, 0)))
                return (error);
 
 #ifdef _POSIX_SAVED_IDS
@@ -365,7 +365,7 @@ sys_setuid(struct setuid_args *uap)
 #ifdef POSIX_APPENDIX_B_4_2_2  /* Use the clause from B.4.2.2 */
            uid == cr->cr_uid ||
 #endif
-           priv_check_cred(cr, PRIV_CRED_SETUID, PRISON_ROOT) == 0) /* we are using privs */
+           priv_check_cred(cr, PRIV_CRED_SETUID, 0) == 0) /* we are using privs */
 #endif
        {
                /*
@@ -416,7 +416,7 @@ sys_seteuid(struct seteuid_args *uap)
        euid = uap->euid;
        if (euid != cr->cr_ruid &&              /* allow seteuid(getuid()) */
            euid != cr->cr_svuid &&             /* allow seteuid(saved uid) */
-           (error = priv_check_cred(cr, PRIV_CRED_SETEUID, PRISON_ROOT)))
+           (error = priv_check_cred(cr, PRIV_CRED_SETEUID, 0)))
                return (error);
        /*
         * Everything's okay, do it.  Copy credentials so other references do
@@ -461,7 +461,7 @@ sys_setgid(struct setgid_args *uap)
 #ifdef POSIX_APPENDIX_B_4_2_2  /* Use BSD-compat clause from B.4.2.2 */
            gid != cr->cr_groups[0] && /* allow setgid(getegid()) */
 #endif
-           (error = priv_check_cred(cr, PRIV_CRED_SETGID, PRISON_ROOT)))
+           (error = priv_check_cred(cr, PRIV_CRED_SETGID, 0)))
                return (error);
 
 #ifdef _POSIX_SAVED_IDS
@@ -473,7 +473,7 @@ sys_setgid(struct setgid_args *uap)
 #ifdef POSIX_APPENDIX_B_4_2_2  /* use the clause from B.4.2.2 */
            gid == cr->cr_groups[0] ||
 #endif
-           priv_check_cred(cr, PRIV_CRED_SETGID, PRISON_ROOT) == 0) /* we are using privs */
+           priv_check_cred(cr, PRIV_CRED_SETGID, 0) == 0) /* we are using privs */
 #endif
        {
                /*
@@ -525,7 +525,7 @@ sys_setegid(struct setegid_args *uap)
        egid = uap->egid;
        if (egid != cr->cr_rgid &&              /* allow setegid(getgid()) */
            egid != cr->cr_svgid &&             /* allow setegid(saved gid) */
-           (error = priv_check_cred(cr, PRIV_CRED_SETEGID, PRISON_ROOT)))
+           (error = priv_check_cred(cr, PRIV_CRED_SETEGID, 0)))
                return (error);
        if (cr->cr_groups[0] != egid) {
                cr = cratom(&p->p_ucred);
@@ -548,7 +548,7 @@ sys_setgroups(struct setgroups_args *uap)
                return(EPERM);
        cr = p->p_ucred;
 
-       if ((error = priv_check_cred(cr, PRIV_CRED_SETGROUPS, PRISON_ROOT)))
+       if ((error = priv_check_cred(cr, PRIV_CRED_SETGROUPS, 0)))
                return (error);
        ngrp = uap->gidsetsize;
        if (ngrp > NGROUPS)
@@ -594,7 +594,7 @@ sys_setreuid(struct setreuid_args *uap)
        if (((ruid != (uid_t)-1 && ruid != cr->cr_ruid && ruid != cr->cr_svuid) ||
             (euid != (uid_t)-1 && euid != cr->cr_uid &&
             euid != cr->cr_ruid && euid != cr->cr_svuid)) &&
-           (error = priv_check_cred(cr, PRIV_CRED_SETREUID, PRISON_ROOT)) != 0)
+           (error = priv_check_cred(cr, PRIV_CRED_SETREUID, 0)) != 0)
                return (error);
 
        if (euid != (uid_t)-1 && cr->cr_uid != euid) {
@@ -632,7 +632,7 @@ sys_setregid(struct setregid_args *uap)
        if (((rgid != (gid_t)-1 && rgid != cr->cr_rgid && rgid != cr->cr_svgid) ||
             (egid != (gid_t)-1 && egid != cr->cr_groups[0] &&
             egid != cr->cr_rgid && egid != cr->cr_svgid)) &&
-           (error = priv_check_cred(cr, PRIV_CRED_SETREGID, PRISON_ROOT)) != 0)
+           (error = priv_check_cred(cr, PRIV_CRED_SETREGID, 0)) != 0)
                return (error);
 
        if (egid != (gid_t)-1 && cr->cr_groups[0] != egid) {
@@ -678,7 +678,7 @@ sys_setresuid(struct setresuid_args *uap)
              euid != cr->cr_uid) ||
             (suid != (uid_t)-1 && suid != cr->cr_ruid && suid != cr->cr_svuid &&
              suid != cr->cr_uid)) &&
-           (error = priv_check_cred(cr, PRIV_CRED_SETRESUID, PRISON_ROOT)) != 0)
+           (error = priv_check_cred(cr, PRIV_CRED_SETRESUID, 0)) != 0)
                return (error);
        if (euid != (uid_t)-1 && cr->cr_uid != euid) {
                cr = change_euid(euid);
@@ -720,7 +720,7 @@ sys_setresgid(struct setresgid_args *uap)
              egid != cr->cr_groups[0]) ||
             (sgid != (gid_t)-1 && sgid != cr->cr_rgid && sgid != cr->cr_svgid &&
              sgid != cr->cr_groups[0])) &&
-           (error = priv_check_cred(cr, PRIV_CRED_SETRESGID, PRISON_ROOT)) != 0)
+           (error = priv_check_cred(cr, PRIV_CRED_SETRESGID, 0)) != 0)
                return (error);
 
        if (egid != (gid_t)-1 && cr->cr_groups[0] != egid) {
@@ -1131,7 +1131,7 @@ sys_setlogin(struct setlogin_args *uap)
        char logintmp[MAXLOGNAME];
 
        KKASSERT(p != NULL);
-       if ((error = priv_check_cred(p->p_ucred, PRIV_PROC_SETLOGIN, PRISON_ROOT)))
+       if ((error = priv_check_cred(p->p_ucred, PRIV_PROC_SETLOGIN, 0)))
                return (error);
        error = copyinstr((caddr_t) uap->namebuf, (caddr_t) logintmp,
            sizeof(logintmp), NULL);
index 9a76e92..efb793f 100644 (file)
@@ -1182,8 +1182,7 @@ sysctl_root(SYSCTL_HANDLER_ARGS)
        if (!(oid->oid_kind & CTLFLAG_ANYBODY) && req->newptr && p &&
            (error = priv_check_cred(p->p_ucred,
             (oid->oid_kind & CTLFLAG_PRISON) ? PRIV_SYSCTL_WRITEJAIL :
-                                               PRIV_SYSCTL_WRITE,
-            (oid->oid_kind & CTLFLAG_PRISON) ? PRISON_ROOT : 0)))
+                                               PRIV_SYSCTL_WRITE, 0)))
                return (error);
 
        if (!oid->oid_handler)
index c006b6a..74e8605 100644 (file)
@@ -152,7 +152,7 @@ vop_helper_setattr_flags(u_int32_t *ino_flags, u_int32_t vaflags,
         * If uid doesn't match only a privileged user can change the flags
         */
        if (cred->cr_uid != uid &&
-           (error = priv_check_cred(cred, PRIV_VFS_SYSFLAGS, PRISON_ROOT))) {
+           (error = priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0))) {
                return(error);
        }
        if (cred->cr_uid == 0 &&
@@ -261,7 +261,7 @@ vop_helper_chown(struct vnode *vp, uid_t new_uid, gid_t new_gid,
        if ((cred->cr_uid != *cur_uidp || new_uid != *cur_uidp ||
            (new_gid != *cur_gidp && !(cred->cr_gid == new_gid ||
            groupmember(new_gid, cred)))) &&
-           (error = priv_check_cred(cred, PRIV_VFS_CHOWN, PRISON_ROOT))) {
+           (error = priv_check_cred(cred, PRIV_VFS_CHOWN, 0))) {
                return (error);
        }
        ogid = *cur_gidp;
index e7f396c..0ed5a2b 100644 (file)
@@ -1599,8 +1599,8 @@ kern_chroot(struct nchandle *nch)
        /*
         * Only privileged user can chroot
         */
-       error = priv_check_cred(p->p_ucred, PRIV_VFS_CHROOT, PRISON_ROOT);
-       if (error != 0)
+       error = priv_check_cred(p->p_ucred, PRIV_VFS_CHROOT, 0);
+       if (error)
                return (error);
 
        /*
@@ -1856,8 +1856,7 @@ kern_mknod(struct nlookupdata *nd, int mode, int rmajor, int rminor)
 
        switch (mode & S_IFMT) {
        case S_IFMT:    /* used by badsect to flag bad sectors */
-               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_BAD,
-                                       PRISON_ROOT);
+               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_BAD, 0);
                vattr.va_type = VBAD;
                break;
        case S_IFCHR:
@@ -1869,13 +1868,11 @@ kern_mknod(struct nlookupdata *nd, int mode, int rmajor, int rminor)
                vattr.va_type = VBLK;
                break;
        case S_IFWHT:
-               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_WHT,
-                                       PRISON_ROOT);
+               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_WHT, 0);
                whiteout = 1;
                break;
        case S_IFDIR:   /* special directories support for HAMMER */
-               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_DIR,
-                                       PRISON_ROOT);
+               error = priv_check_cred(p->p_ucred, PRIV_VFS_MKNOD_DIR, 0);
                vattr.va_type = VDIR;
                break;
        default: