我想打印文件的路径,所以我在link_path_walk(...)
namei.c
函数中编写了此代码
导致内核恐慌。
这段代码有效吗?
char* path_str = NULL;*/
char* ret;*/
int flag_fsm = 0;*/
ret = strstr(name,"_FSM");*/
// add this code - start*/
if(ret != NULL){*/
path_str = (char*)kmalloc(sizeof(name),GFP_KERNEL);*/
strcpy(path_str,name); */
printk(KERN_INFO "%s, link_path_walk() in vfs\n",path_str);*/
flag_fsm = 1;*/
}*/
// add this code - finish*/
while (*name=='/')*/
name++;*/
if (!*name){*/
// add this code - start*/
if(ret != NULL){*/
printk(KERN_INFO "%s, return from link_path_walk() in vfs\n",path_str);*/
kfree(path_str);*/
}*/
// add this code - finish*/
return 0;*/
} */
答案 0 :(得分:1)
鉴于你在某处有name++
,确定name
是指针而不是数组。
因此这段代码:
path_str = (char*)kmalloc(sizeof(name),GFP_KERNEL);
strcpy(path_str,name);
相当危险,因为sizeof(name)
是指针的大小而不是字符串的长度。
例如:
char *name = "way more bytes than in a pointer,"
" and more than the minimum kmalloc size";
会让你感到悲伤,因为你会为path_str
分配四个或八个字节,然后尝试将那个长字符串复制到其中。
分配应该更符合以下方面:
path_str = kmalloc (strlen (name) + 1, GFP_KERNEL);
您还应检查kmalloc
的返回值,如果找不到合适的内存,则返回NULL。这适用于用户态代码,但在内核中甚至更多重要,因为违反内存保护比用户区更糟糕。