我是内核编程的新手,并且对如何处理用户内存中的数据感到困惑。如果我确认strlen_user(user_str)
的返回值不等于零,是否可以将user_str传递给printk
,还是应该总是将user_str
复制到内核内存?
答案 0 :(得分:1)
从内核访问用户空间字符串时,应始终复制用户空间字符串。
假设用户空间应用程序有多个线程。一个在堆上分配字符串并将其传递给您的内核模块。另一个线程同时释放分配的字符串。
然后可能发生以下情况:
strlen_user(user_str)
这可能导致不同的不良后果,包括内核恐慌。
因此,使用strncpy_from_user()
函数从用户空间复制字符串,之后只能使用副本。