给定一个不受信任的内存地址,Linux中有没有一种方法可以测试它是否指向有效的、可访问的内存?
例如,在mach中,您可以使用vm_read_overwrite()尝试从指定位置复制数据。如果地址无效或不可访问,它将返回错误代码,而不是使进程崩溃。
发布于 2013-01-25 03:00:43
这是一个典型的TOCTOU案例--你在某一时刻检查内存是可写的,然后你试图写入它,但不知何故(例如,因为应用程序释放了它),内存不再可访问。
实际上,只有一种有效的方法可以做到这一点,那就是,当你真正需要使用它时,捕获你在写入它时得到的错误。
当然,您可以使用一些技巧来尝试确定内存是否“可能是可写的”,但实际上您无法确保它是可写的。
你可能想稍微解释一下你实际想要做什么,如果你更具体一些,也许我们会有一些更好的想法。
发布于 2013-01-25 01:50:46
从内存中编辑(例如,编辑到/dev/null中( write:使用/dev/null,使用管道可能无法正常工作)),如果地址不可访问,您将收到EFAULT错误。
如果可写内存是可写的,我不知道如何在不破坏其内容的情况下测试可写内存。
发布于 2017-01-05 11:42:03
您可以尝试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
}但是这个函数可能会很慢,不应该在性能关键的情况下使用。
https://stackoverflow.com/questions/14507524
复制相似问题