在内核模块中执行 strstr() 导致崩溃

Crash by executing strstr() inside kernel module

我正在尝试检测特定位置 (myPath) 中的打开文件夹。我正在使用 strstr() 但我发现我的系统在执行此函数后总是崩溃 (picture)。如果我删除检查 (if(ret)),它会正常工作 这是我的代码:

struct task_struct *task_list;
struct fdtable *        fdt = NULL;
unsigned int process_count = 0;
struct path files_path;
char *access_mode;
char *cwd;
int res;
char *myPath = "/home/anh/src/";
char *buf = (char *)kmalloc(GFP_KERNEL,100*sizeof(char));
char * ret;
for_each_process(task_list) {
        fdt = files_fdtable(task_list->files);
        int i=0;
        while(fdt->fd[i] != NULL) { 
            files_path = fdt->fd[i]->f_path;
            cwd = d_path(&files_path,buf,100*sizeof(char));
            if(cwd){//Check if cwd != NULL
                ret = strstr(cwd, myPath);//check seeked file path and myPath
                if(ret) 
                {
                    printk(KERN_INFO "Open file with fd %d  cwd: %s", i,cwd);
                }   
            }    
            i++;
        }
        process_count++;    
    }

有人可以评论并支持我解决这个问题吗?为什么 strstr() 不能在 Linux 内核模块中使用,或者是否有其他方法可以验证字符串是否在字符串中?

此致, 安

一个合理的解释是发生了错误,所以cwd不是一个有效的指针。 strstr 在此无效指针上调用并崩溃。如果没有 if(ret)strstr 调用会被优化掉,因此不会发生崩溃。

Linux 内核中的函数通常 return 错误代码。 documentation of d_path 明确指出是这样的。

Returns a pointer into the buffer or an error code if the path was too long.

if (cwd) 检查 cwd 是否为非空。如果 cwd 包含错误代码,则它是非空的。所以 if (cwd) 不是有用的检查。 return 指针的函数的正确 error checkIS_ERR().

            cwd = d_path(&files_path,buf,100*sizeof(char));
            if (IS_ERR(cwd)) {
                    printk(KERN_WARN "At i=%d: d_path -> %ld", i, PTR_ERR(cwd));
            } else {
                    ret = strstr(cwd, myPath);