我写过这个函数:
void setugid(uid_t uid, gid_t gid) {
uid_t euid = geteuid();
gid_t egid = getegid();
if (setgid(gid) < 0 || setuid(uid) < 0)
assert(0);
}
断言已执行。在核心转储中,我发现了这个变量值:
uid = 8
gid = 12
euid = 0
egid = 0
8和12是正确的ID。当setuid
后跟setgid
时,我看到了这样的问题。但不是我的情况。问题是什么?
我发现了这个问题。 id为8的用户已达到执行进程的限制。
答案 0 :(得分:2)
您应该真正修改程序以显示系统调用返回的错误。
如果您的进程的EUID确实为0,那么该程序只有在无权更改UID或GID(CAP_SETUOD和CAP_SETGID功能)的情况下才会失败,或者您要更改的UID已达到其进程限制并且因此不能再有一个过程。
我建议您在调用setuid()
或setgid()
之前更改功能以打印流程的euid,如果其中任何一个调用失败,请打印errno
。
答案 1 :(得分:0)
我发现了这个问题。 id为8的用户已达到执行进程的限制。