你在内核link_path_walk()中考虑这段代码吗?

时间:2014-01-03 07:30:27

标签: kernel

我想打印文件的路径,所以我在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;*/
} */

1 个答案:

答案 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。这适用于用户态代码,但在内核中甚至更多重要,因为违反内存保护比用户区更糟糕。