在内核模块中为root用户提供权限

3

Linux Kernel 5.0.0-37

我正在编写一个函数来管理权限,作为一个函数指针提供给 struct inode_operations。这里是一个简化的存根实现:

#include <linux/cred.h>

int pfsw_permission(struct inode *ino, int op){
    if(uid_eq(INIT_USER->uid, get_current_user()->uid)){
        printk(KERN_INFO "Current user is root\n");
    } else {
        printk(KERN_INFO "Current user is not root\n");
    }
    if(op & (MAY_READ | MAY_WRITE)){
        return 0;
    }

    return -EACCES;
}

在编译包含此函数的内核模块并尝试加载它时,dmesg 显示以下错误:
Unknown symbol root_user (err -2)

我认为这是由于来自 include/linux/sched/user.hINIT_USER 宏定义所致。
extern struct user_struct root_user;
#define INIT_USER (&root_user)

问题: 为什么声明了符号root_user,但没有定义?如何正确使用INIT_USER


3
这绝不是实现您目标的正确方式。请思考一下哪个现有的标准功能模块可能具有类似的需求,然后查阅该模块的实现方法。 - Chris Stratton
1个回答

2

root_user似乎没有通过Linux内核使用EXPORT_SYMBOL导出,因此您无法从模块中使用它。

查看它的定义,我们可以看到uid值设置为GLOBAL_ROOT_UID。这是在include/linux/uidgid.h中定义的宏,基本上只是将0强制转换为kuid_t,因此如果您只需要UID,则可以使用该宏。

那么...

为什么声明了符号root_user,但没有定义?

该符号已被定义。但它没有被导出,因此您无法从模块中使用它。

如何正确使用“INIT_USER”?
“不可以”。你不能使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接