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

Pointers 如何处理ioctl系统调用的空指针参数,pointers,linux-kernel,segmentation-fault,kernel,Pointers,Linux Kernel,Segmentation Fault,Kernel,如果我们将ioctl中的null指针从用户空间传递到内核空间,会发生什么?如何处理这种情况 我希望解决方案是在指针上使用copy_to_user/copy_from_user,检查指针是否有效。我想知道我是否正确 任何进一步的输入都会有帮助。就内核而言,空指针可以是完全有效的虚拟地址用户空间。考虑到地址零点的页面可以被标记为: 作为超级用户 您应该在用户应用程序中处理空指针,这样做是有意义的。在内核中,您应该: 对空内核指针执行检查 使用“访问\确定”检查提供的指针是否实际位于用户空间中,如果未

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

我希望解决方案是在指针上使用copy_to_user/copy_from_user,检查指针是否有效。我想知道我是否正确


任何进一步的输入都会有帮助。

就内核而言,空指针可以是完全有效的虚拟地址用户空间。考虑到地址零点的页面可以被标记为:

作为超级用户

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

对空内核指针执行检查 使用“访问\确定”检查提供的指针是否实际位于用户空间中,如果未执行“复制\到\用户”,则“复制\到\用户”仍会调用“访问\确定”
是的,从用户复制用户/将用户复制到用户是正确的处理方法。如果给定的指针无效,则会返回非零,此时内核代码应该返回EFAULT[实际上通常为-EFAULT]


在内核模式或用户模式下,空值通常不用作有效指针。然而,正如Michael Foukrakis指出的,可以在地址0处创建一个mmap区域,在这种情况下,可以想象空指针是有效的。无论如何,从用户复制到用户仍然是检测有效地址的正确方法。

我认为这不是真的。从mmap手册页:如果addr为NULL,那么内核将从同一手册页选择创建映射的地址…如果指定了MAP_FIXED标志,并且addr为0 NULL,那么映射的地址将为0 NULL。
mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);