可以将用户内存中的字符串传递给 printk 吗?
Is it okay to pass strings from user memory to printk?
我是内核编程的新手,对应该如何处理用户内存中的数据感到困惑。如果我确认 strlen_user(user_str)
的 return 值不等于零,是否可以将 user_str 传递给 printk
,或者我应该始终将 user_str
复制到内核内存代替?
从内核访问时,您应该始终复制用户空间字符串。
假设用户空间应用程序有多个线程。一个在堆上分配字符串并将其传递给您的内核模块。另一个线程同时释放分配的字符串。
那么可能会出现以下情况:
- 第一个用户空间线程将字符串传递给内核
- 内核验证字符串与
strlen_user(user_str)
一致
- 第二个用户空间线程释放字符串内存
- 内核开始使用所述字符串
这可能会导致不同的不良后果,包括内核恐慌。
因此,使用 strncpy_from_user()
函数从用户空间复制字符串,之后只使用复制。
我是内核编程的新手,对应该如何处理用户内存中的数据感到困惑。如果我确认 strlen_user(user_str)
的 return 值不等于零,是否可以将 user_str 传递给 printk
,或者我应该始终将 user_str
复制到内核内存代替?
从内核访问时,您应该始终复制用户空间字符串。
假设用户空间应用程序有多个线程。一个在堆上分配字符串并将其传递给您的内核模块。另一个线程同时释放分配的字符串。
那么可能会出现以下情况:
- 第一个用户空间线程将字符串传递给内核
- 内核验证字符串与
strlen_user(user_str)
一致
- 第二个用户空间线程释放字符串内存
- 内核开始使用所述字符串
这可能会导致不同的不良后果,包括内核恐慌。
因此,使用 strncpy_from_user()
函数从用户空间复制字符串,之后只使用复制。