linux/fs/namei.c/permission()

/*
 * 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱有鹏老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值