setuid或setgid失败

时间:2014-09-19 10:10:54

标签: c linux

我写过这个函数:

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的用户已达到执行进程的限制。

2 个答案:

答案 0 :(得分:2)

您应该真正修改程序以显示系统调用返回的错误。

如果您的进程的EUID确实为0,那么该程序只有在无权更改UID或GID(CAP_SETUOD和CAP_SETGID功能)的情况下才会失败,或者您要更改的UID已达到其进程限制并且因此不能再有一个过程。

我建议您在调用setuid()setgid()之前更改功能以打印流程的euid,如果其中任何一个调用失败,请打印errno

答案 1 :(得分:0)

我发现了这个问题。 id为8的用户已达到执行进程的限制。