我已经编写了读取/写入/ proc文件的模块,并且工作正常,但是当我为下面显示的权限制作功能时,我想使用权限,这给了我错误(基本上我希望每个人都可以读取文件但是只有root才能写入它。)
int my_permission(struct inode *inode, int op)
{
if(op == 4||(op == 2 && current->euid = 0)) //euid is not a member of task_struct
return 0;
return -EACCES;
}
const struct inode_operations my_iops = {
.permission = my_permission,
};
但它给我的错误如下:
/home/karan/practice/procf/testproc1.c: In function ‘my_permission’:
/home/karan/practice/procf/testproc1.c:50:32: error: ‘struct task_struct’ has no member named ‘euid’
我认为task_struct中有其他成员指向用户ID。我对解决方案以及task_struct成员字段的描述感兴趣。
问候 卡兰
答案 0 :(得分:1)
if(op == 4||(op == 2 && current->euid = 0))
current->euid
吗?也许你想比较一下。current
在哪里定义?我假设它是struct task_struct
,但如果是,那么euid
是指针吗?或current
指向struct task_struct
的指针?如果euid
和current
都不是指针,只需将->
替换为.
有点偏离主题,但是:
const struct inode_operations my_iops = {
.permission = my_permission,
};
让程序员维护你的代码的那种东西想要在睡梦中杀死你。使用typedef
可读性。不要声明全局变量;如果你这样做,不要在函数后声明它们。声明具有部分赋值的结构时,在声明之后执行它更具可读性。
我知道它是一个测试,或一个不完整的代码,或者没有人需要维护的东西。但是你可能想在几年内阅读这篇文章,当你这样做时,你会花费两倍的时间来寻找你想要的解决方案。并且你在SO上发布这个,那里有一些像我一样的风格纳粹,在看到这样的声明之后今晚会有问题。
答案 1 :(得分:1)
参见include / linux / cred.h:
#define current_euid() (current_cred_xxx(euid)) #define current_cred_xxx(xxx) \ ({ \ current_cred()->xxx; \ })
所以current_euid()会回到current_cred():
/** * current_cred - Access the current task's subjective credentials * * Access the subjective credentials of the current task. RCU-safe, * since nobody else can modify it. */ #define current_cred() \ rcu_dereference_protected(current->cred, 1)
那么对于你的问题,要进行有效的UID比较,看看/fs/exec.c:
if (current_euid() == current_uid() && current_egid() == current_gid()) bprm->cred->euid = current_euid(); bprm->cred->euid = inode->i_uid
与您的计划形成鲜明对比:
if (current_euid() == 0)
这意味着即使用户未使用UID = 0进行登录,它也会被有效地视为UID == 0?听起来很危险