summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2003-08-04 00:31:01 +0000
committerrwatson <rwatson@FreeBSD.org>2003-08-04 00:31:01 +0000
commitba4ccf26eaa089507c0a5ea0e7ba5f1ad57ff101 (patch)
tree3a4602a25c33b98c114e6e51ecec47496f7700b5 /sys
parent7d24cc9a9e03b4d06191edacd80aa3b99d968c70 (diff)
downloadFreeBSD-src-ba4ccf26eaa089507c0a5ea0e7ba5f1ad57ff101.zip
FreeBSD-src-ba4ccf26eaa089507c0a5ea0e7ba5f1ad57ff101.tar.gz
In ufs_chmod(), use privilege only when required in the following
cases: - Setting sticky bit on non-directory - Setting setgid on a file with a group that isn't in the effective or extended groups of the authorizing credential I.e., test the requirement first, then do the privilege test, rather than doing the privilege test regardless of the need for privilege. Obtained from: TrustedBSD Project Sponsored by: DARPA, Network Associates Laboratories
Diffstat (limited to 'sys')
-rw-r--r--sys/ufs/ufs/ufs_vnops.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 971fce1..1b461bd 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -645,13 +645,17 @@ ufs_chmod(vp, mode, cred, td)
/*
* Privileged processes may set the sticky bit on non-directories,
* as well as set the setgid bit on a file with a group that the
- * process is not a member of.
+ * process is not a member of. Both of these are allowed in
+ * jail(8).
*/
- if (suser_cred(cred, PRISON_ROOT)) {
- if (vp->v_type != VDIR && (mode & S_ISTXT))
+ if (vp->v_type != VDIR && (mode & S_ISTXT)) {
+ if (suser_cred(cred, PRISON_ROOT))
return (EFTYPE);
- if (!groupmember(ip->i_gid, cred) && (mode & ISGID))
- return (EPERM);
+ }
+ if (!groupmember(ip->i_gid, cred) && (mode & ISGID)) {
+ error = suser_cred(cred, PRISON_ROOT);
+ if (error)
+ return (error);
}
ip->i_mode &= ~ALLPERMS;
ip->i_mode |= (mode & ALLPERMS);
OpenPOWER on IntegriCloud