summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_prot.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1995-04-28 18:17:29 +0000
committerache <ache@FreeBSD.org>1995-04-28 18:17:29 +0000
commit9e8517e291a4b15a4ee478c942e278da29e4d2a6 (patch)
tree23e25464b6baa8b38cea28f3d9d6f21864dadc49 /sys/kern/kern_prot.c
parent8e2075d3f04c055c1dfd57bf948646dacf1b9a38 (diff)
downloadFreeBSD-src-9e8517e291a4b15a4ee478c942e278da29e4d2a6.zip
FreeBSD-src-9e8517e291a4b15a4ee478c942e278da29e4d2a6.tar.gz
Implement POSIX SAVED_IDS for setuid/setgid
Diffstat (limited to 'sys/kern/kern_prot.c')
-rw-r--r--sys/kern/kern_prot.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 657c025..814d06c 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_prot.c 8.6 (Berkeley) 1/21/94
- * $Id: kern_prot.c,v 1.8 1995/04/27 19:23:24 ache Exp $
+ * $Id: kern_prot.c,v 1.9 1995/04/28 17:00:27 ache Exp $
*/
/*
@@ -261,20 +261,24 @@ setuid(p, uap, retval)
int error;
uid = uap->uid;
- if (uid != pc->p_ruid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
+ error = suser(pc->pc_ucred, &p->p_acflag);
+ if (uid != pc->p_ruid && uid != pc->p_svuid && error)
return (error);
/*
* Everything's okay, do it.
* Transfer proc count to new user.
* Copy credentials so other references do not see our changes.
*/
- (void)chgproccnt(pc->p_ruid, -1);
- (void)chgproccnt(uid, 1);
+ if (!error && uid != pc->p_ruid) {
+ (void)chgproccnt(pc->p_ruid, -1);
+ (void)chgproccnt(uid, 1);
+ }
pc->pc_ucred = crcopy(pc->pc_ucred);
pc->pc_ucred->cr_uid = uid;
- pc->p_ruid = uid;
- pc->p_svuid = uid;
+ if (!error) {
+ pc->p_ruid = uid;
+ pc->p_svuid = uid;
+ }
p->p_flag |= P_SUGID;
return (0);
}
@@ -322,12 +326,15 @@ setgid(p, uap, retval)
int error;
gid = uap->gid;
- if (gid != pc->p_rgid && (error = suser(pc->pc_ucred, &p->p_acflag)))
+ error = suser(pc->pc_ucred, &p->p_acflag);
+ if (gid != pc->p_rgid && gid != pc->p_svgid && error)
return (error);
pc->pc_ucred = crcopy(pc->pc_ucred);
pc->pc_ucred->cr_groups[0] = gid;
- pc->p_rgid = gid;
- pc->p_svgid = gid; /* ??? */
+ if (!error) {
+ pc->p_rgid = gid;
+ pc->p_svgid = gid;
+ }
p->p_flag |= P_SUGID;
return (0);
}
OpenPOWER on IntegriCloud