diff options
| -rw-r--r-- | sys/alpha/osf1/osf1_misc.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/alpha/osf1/osf1_misc.c b/sys/alpha/osf1/osf1_misc.c index 4e2fdebb82ec5..7a7eaf08adb4a 100644 --- a/sys/alpha/osf1/osf1_misc.c +++ b/sys/alpha/osf1/osf1_misc.c @@ -1070,15 +1070,20 @@ osf1_setuid(p, uap) uid != pc->p_ruid && uid != pc->p_svuid) return (error); - pc->pc_ucred = crcopy(pc->pc_ucred); - pc->pc_ucred->cr_uid = uid; if (error == 0) { - (void)chgproccnt(pc->p_ruid, -1, 0); - (void)chgproccnt(uid, 1, 0); - pc->p_ruid = uid; - pc->p_svuid = uid; + if (uid != pc->p_ruid) { + change_ruid(p, uid); + setsugid(p); + } + if (pc->p_svuid != uid) { + pc->p_svuid = uid; + setsugid(p); + } + } + if (pc->pc_ucred->cr_uid != uid) { + change_euid(p, uid); + setsugid(p); } - p->p_flag |= P_SUGID; return (0); } @@ -1112,7 +1117,7 @@ osf1_setgid(p, uap) pc->p_rgid = gid; pc->p_svgid = gid; } - p->p_flag |= P_SUGID; + setsugid(p); return (0); } |
