1

给定一个不受信任的内存地址,Linux 中有没有办法测试它是否指向有效的、可访问的内存?

例如,在 mach 中,您可以使用 vm_read_overwrite() 尝试从指定位置复制数据。如果地址无效或不可访问,它将返回错误代码而不是使进程崩溃。

4

3 回答 3

2

write从该内存中(/dev/null例如,进入 (编辑:/dev/null它可能无法按预期工作,请使用管道)),EFAULT如果地址不可访问,您将收到错误消息。

如果它是可写的,我不知道如何在不破坏其内容的情况下测试可写内存。

于 2013-01-24T17:50:45.680 回答
1

这是TOCTOU的典型案例- 您在某个时间点检查内存是否可写,然后稍后您尝试写入它,并且不知何故(例如,因为应用程序释放了它),内存不再可访问。

实际上只有一种有效的方法可以做到这一点,那就是,当你真正需要使用它时,捕获你写给它的错误。

当然,您可以使用技巧来尝试确定内存是否“可写”,但实际上无法确保它是可写的。

您可能想稍微解释一下您实际尝试做的事情,如果您更具体,也许我们可以有一些更好的想法。

于 2013-01-24T19:00:43.483 回答
1

你可以试试 msync:

int page_size = getpagesize();                                                            
void *aligned = (void *)((uintptr_t)p & ~(page_size - 1));                           
if (msync(aligned, page_size, MS_ASYNC) == -1 && errno == ENOMEM) {
    // Non-accessibe
}

但是这个功能可能会很慢,不应该在性能关键的情况下使用。

于 2017-01-05T03:42:02.933 回答