struct task_struct成员?

时间:2012-02-02 18:28:49

标签: c linux-kernel linux-device-driver

我已经编写了读取/写入/ 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成员字段的描述感兴趣。

问候 卡兰

2 个答案:

答案 0 :(得分:1)

if(op == 4||(op == 2 && current->euid = 0))
  1. 您确定要将0分配给current->euid吗?也许你想比较一下。
  2. current在哪里定义?我假设它是struct task_struct,但如果是,那么euid是指针吗?或current指向struct task_struct的指针?如果euidcurrent都不是指针,只需将->替换为.
  3. 有点偏离主题,但是:

    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?听起来很危险