将字符串从用户内存传递给printk是否可以?

时间:2016-03-25 14:56:05

标签: c linux memory linux-kernel kernel

我是内核编程的新手,并且对如何处理用户内存中的数据感到困惑。如果我确认strlen_user(user_str)的返回值不等于零,是否可以将user_str传递给printk,还是应该总是将user_str复制到内核内存?

1 个答案:

答案 0 :(得分:1)

从内核访问用户空间字符串时,应始终复制用户空间字符串。

假设用户空间应用程序有多个线程。一个在堆上分配字符串并将其传递给您的内核模块。另一个线程同时释放分配的字符串。

然后可能发生以下情况:

  • 第一个用户空间线程将字符串传递给内核
  • 内核使用strlen_user(user_str)
  • 验证字符串是否正常
  • 第二个用户空间线程释放字符串内存
  • 内核开始使用上述字符串

这可能导致不同的不良后果,包括内核恐慌。

因此,使用strncpy_from_user()函数从用户空间复制字符串,之后只能使用副本。