如何处理空指针参数到ioctl系统调用



如果我们在ioctl中从用户空间传递空指针到内核空间会发生什么?如何处理这种情况?

我期待的解决方案是使用copy_to_user/copy_from_user对指针执行检查指针是否有效。我想知道我是否正确。

对于内核来说,空指针可以是一个完全有效的虚拟地址(用户空间)。考虑地址为0的页面可以通过以下方式进行mmap()编辑:

mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);

作为超级用户。

应该在用户应用程序中处理NULL指针,这样做是有意义的。在内核中,您应该:

  • 执行NULL 内核指针的检查
  • 使用access_ok检查提供的指针实际上是在用户空间,如果没有执行copy_to_user (copy_to_user调用access_ok无论如何)

是的,copy_from_user/copy_to_user是处理这个问题的正确方法。如果给定的指针无效,则会返回一个非零返回值(此时,内核代码应该返回EFAULT[实际上通常是-EFAULT])。

在内核模式或用户模式下,null值通常不用作有效指针。然而,正如Michael Foukrakis指出的那样,可以在地址0处创建一个mmap区域,在这种情况下,可以想象NULL指针将是有效的。在任何情况下,copy_from_user/copy_to_user仍然是检测有效地址的正确方法。

最新更新