2012-02-02 81 views
-1

我已经写了模块读/写在/ proc文件和工作正常,但要使用权限与它时,我给下面显示的权限,它给了我错误(基本上我希望每个人都可以读取文件,但只有根可以写在里面)。struct task_struct成员?

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

你看过http://kernel.org/doc/htmldocs/ – 2012-02-02 19:00:55

+0

@Shiplu我想要一些关于task_struct的具体内容,没有别的.........虽然链接很好。 – karan421 2012-02-02 19:08:55

+0

Google“linux lxr”,找到'struct task_struct'的定义,看看你有哪些字段。 – ugoren 2012-02-02 19:37:18

回答

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

1
if(op == 4||(op == 2 && current->euid = 0)) 
  1. 您确定要分配0到current->euid?也许你打算比较一下。
  2. current在哪里定义?我假设它的struct task_struct,但如果是这样,是euid一个指针?或者是current指向struct task_struct?如果没有euid也不current的指针只是.

类进行主题的更换->,但:

const struct inode_operations my_iops = { 
.permission = my_permission, 
}; 

是,这将使程序员维护你的代码之类的话要杀死你在你的睡眠中。为了便于阅读,请使用typedef。不要声明全局变量;如果你这样做,不要在函数之后声明它们。在声明具有部分赋值的结构时,在声明之后它的可读性更高。

我知道它是一个测试,或者是一个不完整的代码,或者没有人需要维护的东西。但是你可能想在几年内阅读这些内容,当你这样做时,你会花费两倍的时间去寻找你正在寻找的解决方案。而且你在SO上张贴这样的话,那里有一些像我这样的纳粹风格的人,在看到这样的声明后,今晚会有困难。

+1

与[this](http://kerneltrap.org/node/1584)惊人的相似,试图在Linux内核中创建一个后门。 – ugoren 2012-02-02 19:34:48

+0

@whitelion好吧我可以理解会有一些编写代码的标准....但是这个代码是我从“Linux内核编程指南”中拿出来的,并且在将来我会尝试给你的建议(以便你可以睡觉(只是开玩笑))....但最新的解决方案..... – karan421 2012-02-02 19:58:03

+0

@karan你试过改变current-> euid current.euid? – whitelionV 2012-02-02 20:17:18