我写了这个函数:
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 的用户已达到其执行进程的限制。
最佳答案
你真的应该修改你的程序来显示系统调用返回的错误。
如果您的进程的 EUID 确实为 0,则该程序只有在没有更改 UID 或 GID 的权限(CAP_SETUOD 和 CAP_SETGID 功能),或者如果您要更改的 UID 已达到其进程限制并且因此不能再有一个进程。
我建议在调用 setuid()
或 setgid()
之前更改您的函数以打印进程的 euid,并打印 errno
如果这些调用中的任何一个失败。
关于c - setuid 或 setgid 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25931470/