可以将用户内存中的字符串传递给 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() 函数从用户空间复制字符串,之后只使用复制。