给定一个不受信任的内存地址,Linux中有没有办法测试它是否指向有效的可访问内存?
例如,在mach中,您可以使用vm_read_overwrite()尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是崩溃进程。
这是TOCTOU的典型案例 - 你在某些时候检查内存是可写的,然后你尝试写入它,并以某种方式(例如因为应用程序解除分配它),内存不再可访问。
只有一种有效的方法可以实现这一点,也就是说,当您真正需要使用它时,可以捕获从写入中获得的错误。
当然,您可以使用技巧来判断内存是否“可写”,但实际上您无法确保它是可写的。
您可能想稍微解释一下您实际上要做的事情,如果您更具体,我们可能会有更好的想法。
write
来自那个记忆(例如,进入/dev/null
(编辑:使用/dev/null
它可能无法按预期工作,使用管道)),如果地址无法访问,您将收到EFAULT
错误。
我不知道如何在不破坏其内容的情况下测试可写内存(如果它是可写的)。
您可以尝试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
}
但是这个功能可能很慢,不应该用于性能危急情况。