summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_prot.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-03-31 13:41:49 +0000
committerpeter <peter@FreeBSD.org>1997-03-31 13:41:49 +0000
commitf11bf14d6e9e593ba9595e75fdfe6e792d308eb8 (patch)
treee1850bed7293b550ddd59be6108d9b9b1459a342 /sys/kern/kern_prot.c
parent989793b098f68ba61457519b13678c6136d0b88d (diff)
downloadFreeBSD-src-f11bf14d6e9e593ba9595e75fdfe6e792d308eb8.zip
FreeBSD-src-f11bf14d6e9e593ba9595e75fdfe6e792d308eb8.tar.gz
Do not set the P_SUGID flag in seteuid()/setegid() if nothing has changed.
(for supporting issetugid())
Diffstat (limited to 'sys/kern/kern_prot.c')
-rw-r--r--sys/kern/kern_prot.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 53eff49..becc3f6 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.27 1997/03/31 13:21:37 peter Exp $
+ * $Id: kern_prot.c,v 1.28 1997/03/31 13:36:46 peter Exp $
*/
/*
@@ -421,16 +421,19 @@ seteuid(p, uap, retval)
int error;
euid = uap->euid;
- if (euid != pc->p_ruid && euid != pc->p_svuid &&
+ if (euid != pc->p_ruid && /* allow seteuid(getuid()) */
+ euid != pc->p_svuid && /* allow seteuid(saved uid) */
(error = suser(pc->pc_ucred, &p->p_acflag)))
return (error);
/*
* Everything's okay, do it. Copy credentials so other references do
* not see our changes.
*/
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_uid = euid;
- p->p_flag |= P_SUGID;
+ if (pc->pc_ucred->cr_uid != euid) {
+ pc->pc_ucred = crcopy(pc->pc_ucred);
+ pc->pc_ucred->cr_uid = euid;
+ p->p_flag |= P_SUGID;
+ }
return (0);
}
@@ -532,12 +535,15 @@ setegid(p, uap, retval)
int error;
egid = uap->egid;
- if (egid != pc->p_rgid && egid != pc->p_svgid &&
+ if (egid != pc->p_rgid && /* allow setegid(getgid()) */
+ egid != pc->p_svgid && /* allow setegid(saved gid) */
(error = suser(pc->pc_ucred, &p->p_acflag)))
return (error);
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_groups[0] = egid;
- p->p_flag |= P_SUGID;
+ if (pc->pc_ucred->cr_groups[0] != egid) {
+ pc->pc_ucred = crcopy(pc->pc_ucred);
+ pc->pc_ucred->cr_groups[0] = egid;
+ p->p_flag |= P_SUGID;
+ }
return (0);
}
OpenPOWER on IntegriCloud