diff options
author | rwatson <rwatson@FreeBSD.org> | 2003-08-04 00:31:01 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2003-08-04 00:31:01 +0000 |
commit | ba4ccf26eaa089507c0a5ea0e7ba5f1ad57ff101 (patch) | |
tree | 3a4602a25c33b98c114e6e51ecec47496f7700b5 | |
parent | 7d24cc9a9e03b4d06191edacd80aa3b99d968c70 (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 14 |
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); |