如果我们将ioctl中的空指针从用户空间传递到内核空间会发生什么?如何处理这种情况?
我希望解决方案是在指针上使用copy_to_user / copy_from_user,该指针执行指针检查是否有效。我想知道我是否正确。
任何进一步的输入都会有所帮助。
答案 0 :(得分:3)
就内核而言,空指针可以是完全有效的虚拟地址(用户空间)。请考虑地址为零的页面可以mmap()
编辑:
mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);
作为超级用户。
您应该在用户应用程序中处理NULL指针,这样做是有意义的。在内核中,你应该:
access_ok
检查提供的指针实际上是否在用户空间中,如果没有执行copy_to_user
(copy_to_user
调用access_ok
无论如何)答案 1 :(得分:-1)
是的,copy_from_user / copy_to_user是处理此问题的正确方法。如果你给出的指针无效,将产生非零返回(此时,内核代码应该返回EFAULT [实际上通常是-EFAULT])。
在内核模式或用户模式下,空值通常不用作有效指针。但是,正如Michael Foukrakis指出的那样,可以在地址0处创建一个mmap区域,在这种情况下可以想象一个NULL指针是有效的。无论如何,copy_from_user / copy_to_user仍然是检测有效地址的正确方法。