在 gcc 中,以 root 用户身份,我
setuid
使用无效的用户 ID (3009) 调用系统调用。errno
变量为0
(成功)。当程序运行时,在另一个会话中我执行
ps
命令,看到 uid 和 euid 的值是 3009(无效的用户 ID)。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main () {
int i;
i=setuid(3009); // user id 3009 does not exists
printf ("i=%d, err=%d(%s)\n", i, errno, strerror(errno));
exit(0);
}
没问题还是有其他原因?平台是 gcc 11.4 和 Ubuntu 22.04.4。
3009(通常)不是无效的用户 ID。我猜你的意思是没有具有该 uid 的用户帐户,但内核不知道或不关心将 uid 号映射到用户名或其他帐户详细信息。没有这样的映射不会使 uid 无效。所以是的,没问题,因为内核和系统
setuid()
调用包装器(通常)会接受它。但这并不意味着它是明智或良好的形式。