0

LDD3的例子中,access_ok()放置在ioctl内核模块方法的开头,用于检查从用户空间传递的指针是否有效。ioctl()当用户空间应用程序调用系统调用并传递一个变量的地址时,它是正确的。然而,在某些情况下,ioctl()系统调用是用一个值而不是指针作为第三个参数调用的,最后是access_ok()内核模块中的第二个参数。

我试图传递一个整数作为access_ok()'s 第二个参数,它工作正常。没有报告错误。但我不太确定这种用法是否正确?

例如,如果我ioctl()在用户空间中调用它的第三个参数是“3”。然后,在 ,ioctl()方法中struct file_operationsaccess_ok()将接收3它的第二个参数。因为access_ok()需要一个指针,所以它转换3为一个用户空间指针。反观是错的...

4

2 回答 2

0

用户空间程序可以给你任何随机值作为指针,因此access_ok()必须能够处理任何随机值。所以access_ok()用非指针值调用绝对没问题。

但是,除非您真的要尝试访问该内存位置,否则调用access_ok()是完全没有意义的。(就此而言,如果可能,您应该避免access_ok()并仅检查实际的用户空间访问(get_user()等)是否有错误。)

于 2015-06-16T07:38:18.740 回答
0

实际上,access_ok的检查是粗略的。函数描述(在源文件中)说:

请注意,根据体系结构,此函数可能只是检查指针是否在用户空间范围内 - 在调用此函数后,内存访问函数可能仍会返回 -EFAULT。

例如,根据 source arch/x86/include/asm/uaccess.h,在 x86 上access_ok只检查给定地址是否指向下部区域(因为内核在上部区域之外)。因此,它返回true的地址等于3

它是copy_from_user/copy_to_user谁返回有关用户内存可访问性的最终裁决。

于 2015-06-16T09:31:24.313 回答