使用copy_to_user在内核模式下检查有效的用户内存

时间:2015-11-10 19:39:44

标签: linux-kernel

所以,我尝试使用它:

abort

我想从copy_to_user(p, q, 0) 复制到q,如果它不起作用,那么我想知道p是否指向无效地址。

p返回未成功复制的字节数,但在这种情况下,有0个字节,我无法确定copy_to_user是否指向无效地址。

还有另一种方法可以检查p是否指向有效的用户内存吗?

3 个答案:

答案 0 :(得分:0)

是。每次调用copy_to_user()之前,您需要手动检查传递大小值。如果它在0或不在有效范围内 - 你根本不应该调用copy_to_user()。这样您就可以依赖copy_to_user()返回值。

答案 1 :(得分:0)

在/usr/src/linux-3.0.6-gentoo/include/asm-generic/uaccess.h中定义的copy_to_user方法

static inline long copy_to_user(void __user *to,
                const void *from, unsigned long n)
{
        might_fault();
        if (access_ok(VERIFY_WRITE, to, n))
                return __copy_to_user(to, from, n);
        else
                return n;
}

方法access_ok检查(用户内存)的可访问性。所以你可以使用access_ok方法来检查内存是否有效(在用户空间中不是NULL / it)?

参数VERIFY_READ或VERIFY_WRITE。 VERIFY_READ:标识内存区域是否可读,VERIFY_WRITE:标识内存区域是否可读和可写。 source of method access_ok

答案 2 :(得分:0)

您认为'有效的用户记忆&#39 ;?你需要什么呢?

让我们说我们只关心驻留在用户空间范围内的目标缓冲区(对于具有联合地址空间的拱门)。仅从这一点我们就可以看出,测试没有大小的地址是没有意义的 - 如果地址是用户空间的最后一个字节怎么办?适当/范围/检查由access_ok完成。

第二部分是那里是否有页面,或者可以在不处理页面错误的情况下执行读/写操作。这对你有什么顾虑吗?如果您阅读copy_from /您将看到它执行读/写操作,并且只捕获故障。肯定有KPI来检查目标页面是否可以没有错误地写入,但你需要在你的支票上持有锁(mmap_sem和更多)以及你接下来要做什么,这可能不是你想要的要做。

到目前为止,您似乎正在尝试