2012-12-05 56 views
1

我觉得这个问题已经得到解答,但是我没有发现从Google搜索中找到的实现提供了我需要的保护。复制userland的变量

我正在使用linux 3.2.2。

我希望尽可能安全地将变量从用户空间复制到内核空间。这包括一个结构指针和一个以空字符结尾的字符串。我怎么能确保我的结构指针是有效的? (access_ok on(void *)-1不能捕捉它)我想它基本上是白痴的证明...

对于null终止的字符串我不知道长度和一些函数复制这些null终止的字符串需要大小。

+1

一些有用的信息,如果你是在内核你知道哪些不会忽略是有效的(你有机会从MMU全部转换表),从那里你可以检查给定ADRESS是至少对该应用程序有效。如果结构本身只包含合理的数据,那么如果您不知道有关数据的任何限制,则很难保证。 – RedX

回答

0

解决:所以我找到的最好的解决方案实际上是我使用的代码只是放一个而不是一个或。

首先检查ptr是否为空。 然后

如果通过我们的USR PTR或结构是用户地址空间内。 最后用

int copy_from_user(void* dest, void* src,size_t len) 

,并确保destPtr点在内核这就是大小的空间显然是> = structsize。 即使现在也不能保证结构中的数据是有用的,或者你想要的。它只是原始数据,不会导致内核恐慌。所以现在你可以检查结构的每个成员的有效数据。有这个

https://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/

0

使用ioctl我们应该能够将结构复制到内核空间。我已经成功地使用创建的虚拟ioctl将变量复制到内核。