tftpd: call setgroups() before initgroups()

Unconditionally call setgroups() before calling
initgroups(). That way if initgroups() fails for some reason (e.g. it
is unable to access /etc/groups or the equivalent) then at least the
group list will be empty.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin 2024-05-29 17:49:21 -07:00
parent b9f2335e88
commit 416046e2ad

View file

@ -980,23 +980,20 @@ int main(int argc, char **argv)
/etc/group still need to be accessible at this point.
If we get EPERM, this is already a restricted process, e.g.
using user namespaces on Linux. */
setrv = -1;
die = 0;
#ifdef HAVE_SETGROUPS
setrv = setgroups(0, NULL);
if (setrv && errno != EPERM) {
syslog(LOG_ERR, "cannot clear group list");
die = EX_OSERR;
}
#endif
#ifdef HAVE_INITGROUPS
setrv = initgroups(user, pw->pw_gid);
if (setrv && errno != EPERM) {
syslog(LOG_ERR, "cannot set groups for user %s", user);
die = EX_OSERR;
}
#endif
#ifdef HAVE_SETGROUPS
if (setrv) {
setrv = setgroups(0, NULL);
if (setrv && errno != EPERM) {
syslog(LOG_ERR, "cannot clear group list");
die = EX_OSERR;
}
}
#endif
if (die)
exit(die);