linux/fs/namei.c/permission()

来源:互联网 发布:计算机编程相关书籍 编辑:程序博客网 时间:2024/05/18 08:49
/*
 * permission()
 *
 * is used to check for read/write/execute permissions on a file.
 * I don't know if we should look at just the euid or both euid and
 * uid, but that should be easily changed.
 */
// permission()函数用来检验当前进程对inode指向的文件是否有mask标示的权限
static int permission(struct m_inode * inode,int mask)
{
// 取出inode的i_mode,这表明了imode指向的文件本身的读写权限。
int mode = inode->i_mode;


/* special case: not even root can read/write a deleted file */
// inode->i_dev存在(i节点有对应的设备),并且inode->i_nlinks=0
// (即文件没有被引用),则表明这个文件是一个被删除了的文件。即使是
// 超级用户root也没有操作已删除文件的权限,因此return 0
if (inode->i_dev && !inode->i_nlinks)
return 0;
// 首先明白euid的含义。euid是进程task_struct中的一个short字段。一般
// 一个进程的euid等于运行这个进程的用户的uid。(同样地egid等于运行
// 这个进程的用户的gid),这样这个进程就有了运行进程的用户的权限设置了。
// 其次明白inode->i_uid的含义。i_uid用来标示inode指向的文件的uid,即这个
// 文件的宿主的uid。同样地,i_gid表明文件宿主所在的group的gid
// 当前进程的euid == inode->i_uid,表明运行进程的用户和该文件的宿主用户
// 是同一用户。此时inode文件在被自己的宿主使用,因此应该查三组权限位中的
// U(SUGO:即超级用户,宿主,宿主group,others中的U)
else if (current->euid==inode->i_uid)
// mode>>6,将U所在的三位移到了最底三位。
mode >>= 6;
// 若操作inode文件的用户不是文件宿主,但是是宿主group内的成员,则适用G权限位
else if (current->egid==inode->i_gid)
// mode>>3将G移到了最低3bit
mode >>= 3;
// 这里两个else if却没有最后的else,其实相当于是有个default的,default就是
// 对mode不做处理。因为default的情况对应着O权限位(即others),刚好是mode的
// 最低3bit,所以不用做什么处理。
// mode & 0007取出了mode的最低三位,再位与mask后,若等于mask说明mode表示的权限
// 包含mask,即当前进程有mask表示的操作权限,返回1.若不等则返回0.
// suser()宏用来判断当前进程的宿主是否是超级用户root(current->euid == 0)
// 超级用户对于所有文件具有操作权限,所以直接返回1.
if (((mode & mask & 0007) == mask) || suser())
return 1;
return 0;
}
原创粉丝点击