Some setre{g,u}id() tweaking. What happens to the saved set-{g,u}id is
not specified by the standard, but other systems set it as well in most cases. We set it to real {g,u}uid now, if that changes. OpenSSH (sshd) seems to be agreeable with that solution. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24974 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
2d8e02e435
commit
5b53519c63
@ -43,6 +43,8 @@ common_setregid(gid_t rgid, gid_t egid, bool setAllIfPrivileged, bool kernel)
|
||||
|
||||
bool privileged = kernel || is_privileged(team);
|
||||
|
||||
gid_t ssgid = team->saved_set_gid;
|
||||
|
||||
// real gid
|
||||
if (rgid == (gid_t)-1) {
|
||||
rgid = team->real_gid;
|
||||
@ -62,8 +64,17 @@ common_setregid(gid_t rgid, gid_t egid, bool setAllIfPrivileged, bool kernel)
|
||||
rgid = team->real_gid;
|
||||
} else {
|
||||
// setregid() semantics: set the real gid, if allowed to
|
||||
if (!privileged && rgid != team->real_gid)
|
||||
// Note: We allow setting the real gid to the effective gid. This
|
||||
// is unspecified by the specs, but is common practice.
|
||||
if (!privileged && rgid != team->real_gid
|
||||
&& rgid != team->effective_gid) {
|
||||
return EPERM;
|
||||
}
|
||||
|
||||
// Note: Also common practice is to set the saved set-gid when the
|
||||
// real gid is set.
|
||||
if (rgid != team->real_gid)
|
||||
ssgid = rgid;
|
||||
}
|
||||
}
|
||||
|
||||
@ -80,6 +91,7 @@ common_setregid(gid_t rgid, gid_t egid, bool setAllIfPrivileged, bool kernel)
|
||||
// Getting here means all checks were successful -- set the gids.
|
||||
team->real_gid = rgid;
|
||||
team->effective_gid = egid;
|
||||
team->saved_set_gid = ssgid;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
@ -94,6 +106,8 @@ common_setreuid(uid_t ruid, uid_t euid, bool setAllIfPrivileged, bool kernel)
|
||||
|
||||
bool privileged = kernel || is_privileged(team);
|
||||
|
||||
uid_t ssuid = team->saved_set_uid;
|
||||
|
||||
// real uid
|
||||
if (ruid == (uid_t)-1) {
|
||||
ruid = team->real_uid;
|
||||
@ -119,6 +133,11 @@ common_setreuid(uid_t ruid, uid_t euid, bool setAllIfPrivileged, bool kernel)
|
||||
&& ruid != team->effective_uid) {
|
||||
return EPERM;
|
||||
}
|
||||
|
||||
// Note: Also common practice is to set the saved set-uid when the
|
||||
// real uid is set.
|
||||
if (ruid != team->real_uid)
|
||||
ssuid = ruid;
|
||||
}
|
||||
}
|
||||
|
||||
@ -135,6 +154,7 @@ common_setreuid(uid_t ruid, uid_t euid, bool setAllIfPrivileged, bool kernel)
|
||||
// Getting here means all checks were successful -- set the uids.
|
||||
team->real_uid = ruid;
|
||||
team->effective_uid = euid;
|
||||
team->saved_set_uid = ssuid;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user