强制 copy_to_user() 失败

Forcing copy_to_user() to fail

我正在尝试编写一个测试,其中 copy_to_user() 失败(仅复制部分数据,或者完全复制 none,不使用 NULL 指针),但我没有成功。

测试,在用户模式下有以下几行:

type to[1];
foo(to);

foo 是一个包装函数,它调用具有以下行的系统调用:

type from[2] = {something1, something2};
int not_copied = copy_to_user(to, from, sizeof(type) * 2);

事实证明 not_copied 是 0,即使我尝试对 "type to" 声明使用 malloc。另外,'to[0]'和'to[1]'分别是'something1'和'something2'。

我认为我的 'type to' 声明没有按预期限制 copy_to_user 目的地的内存,这对吗?

如何让它失败?

谢谢。

据我了解,要使 copy_to_user 失败,范围内的某些地址实际上必须是不可写或未映射的。您的 type to[1] 只是用户 space 内存页面中某处的地址;如果它在堆栈上,则紧随其后的地址将始终是可写的,因为堆栈会向下增长(除非您在 HPPA 上,而您几乎肯定不是);如果将它放在数据段中,则必须非常小心地进行设置,以确保它恰好位于数据段的末尾,之后没有任何内容;原则上 malloc 分配 可以 之后立即没有任何东西,但除非你使用像 ElectricFence 这样的分配器,它在每次分配后故意立即放置未映射的保护页,它几乎肯定会赢't.

为了有意设置写入访问可访问和不可访问内存的情况,您可以这样做:

size_t pagesize = sysconf(_SC_PAGESIZE);
char *to_allocation = mmap(0, 2*pagesize, PROT_READ|PROT_WRITE,
                           MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
memset(to_allocation, 0x55, 2*pagesize); // force allocation
mprotect(to_allocation + pagesize, pagesize, PROT_NONE);

foo(to_allocation + pagesize - sizeof(type));

(但当然有错误处理。)

我已通过进行以下更改使其可靠地失败:

type to[SMALL_INTEGER]
foo(to)

包装器具有:

type from[HUGE_INTEGER]
// fill from with huge amount of data <- unsure if this part is necessary
int not_copied = copy_to_user(to, from, sizeof(type) * HUGE_INTEGER);