- gid = uap->gid;
- if (u.u_rgid == gid || u.u_gid == gid || suser()) {
- leavegroup(u.u_gid); leavegroup(u.u_rgid);
- (void) entergroup(gid);
- u.u_gid = gid;
- u.u_rgid = gid;
+ rgid = uap->rgid;
+ if (rgid == -1)
+ rgid = u.u_rgid;
+ if (u.u_rgid != rgid && u.u_gid != rgid && !suser())
+ return;
+ egid = uap->egid;
+ if (egid == -1)
+ egid = u.u_gid;
+ if (u.u_rgid != egid && u.u_gid != egid && !suser())
+ return;
+ if (u.u_rgid != rgid) {
+ leavegroup(u.u_rgid);
+ (void) entergroup(rgid);
+ u.u_rgid = rgid;