我可以将整数作为第二个参数传递给“access_ok()”吗?
Can I pass an integer to `access_ok()` as it's second argument?
在LDD3的例子中,access_ok()
放在内核模块的ioctl
方法的开头,用于检查是否从用户空间传递的指针已验证。当用户空间应用程序调用 ioctl()
系统调用并向其传递一个变量地址时,这是正确的。然而,在某些情况下,ioctl()
系统调用是用一个值而不是指针作为第三个参数调用的,最后是内核模块中 access_ok()
的第二个参数。
我尝试传递一个整数作为 access_ok()
的第二个参数,但效果很好。没有报错。但我不太确定这种用法是否正确?
例如,如果我在用户空间中调用 ioctl()
,它的第三个参数为“3”。然后,在 struct file_operations
的 ioctl()
方法中,access_ok()
将接收 3
作为第二个参数。因为 access_ok()
需要一个指针,所以它将 3
转换为用户空间指针。反过来看,是错误的...
用户空间程序可以为您提供任何随机值作为指针,因此 access_ok()
必须能够处理任何随机值。
所以用非指针值调用access_ok()
肯定是可以的
但是,除非您真的要尝试访问该内存位置,否则调用 access_ok()
是完全没有意义的。
(就此而言,如果可能的话,您应该避免 access_ok()
并只检查实际的用户空间访问(get_user()
等)是否有错误。)
其实access_ok
的检查很粗糙。函数的描述(在源文件中)说:
Note that, depending on architecture, this function probably just
checks that the pointer is in the user space range - after calling
this function, memory access functions may still return -EFAULT.
例如,根据来源 arch/x86/include/asm/uaccess.h
,在 x86 上 access_ok
只是检查给定地址指向 lower 区域(因为内核除了在 upper区域)。因此,它 returns true
的地址等于 3
.
copy_from_user
/copy_to_user
return 关于用户内存可访问性的最终裁决。
在LDD3的例子中,access_ok()
放在内核模块的ioctl
方法的开头,用于检查是否从用户空间传递的指针已验证。当用户空间应用程序调用 ioctl()
系统调用并向其传递一个变量地址时,这是正确的。然而,在某些情况下,ioctl()
系统调用是用一个值而不是指针作为第三个参数调用的,最后是内核模块中 access_ok()
的第二个参数。
我尝试传递一个整数作为 access_ok()
的第二个参数,但效果很好。没有报错。但我不太确定这种用法是否正确?
例如,如果我在用户空间中调用 ioctl()
,它的第三个参数为“3”。然后,在 struct file_operations
的 ioctl()
方法中,access_ok()
将接收 3
作为第二个参数。因为 access_ok()
需要一个指针,所以它将 3
转换为用户空间指针。反过来看,是错误的...
用户空间程序可以为您提供任何随机值作为指针,因此 access_ok()
必须能够处理任何随机值。
所以用非指针值调用access_ok()
肯定是可以的
但是,除非您真的要尝试访问该内存位置,否则调用 access_ok()
是完全没有意义的。
(就此而言,如果可能的话,您应该避免 access_ok()
并只检查实际的用户空间访问(get_user()
等)是否有错误。)
其实access_ok
的检查很粗糙。函数的描述(在源文件中)说:
Note that, depending on architecture, this function probably just checks that the pointer is in the user space range - after calling this function, memory access functions may still return -EFAULT.
例如,根据来源 arch/x86/include/asm/uaccess.h
,在 x86 上 access_ok
只是检查给定地址指向 lower 区域(因为内核除了在 upper区域)。因此,它 returns true
的地址等于 3
.
copy_from_user
/copy_to_user
return 关于用户内存可访问性的最终裁决。