在内核模块中执行 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 check 是 IS_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);
我正在尝试检测特定位置 (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 check 是 IS_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);