gpt4 book ai didi

c - 如何处理来自 copy_from_user() 的页面错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:04 25 4
gpt4 key购买 nike

我有以下系统调用:

long do_print(int n, char *p){
char tmp[n]; //allocate array of n bytes
int ret = copy_from_user(tmp,p,n);
if (!ret){
//do something with tmp
}
return ret;
}

它为 n>5000 返回非零值(我估计是因为页面错误)。

如何强制复制成功。也就是说,系统调用返回非零值怎么办?

最佳答案

在堆栈上分配一个大数组不是你应该做的,也不是你真的可以做的。 linux 内核使用一个小堆栈运行,通常是 2 个内存页。如果您的 char tmp[n]; 依赖于来自用户空间的 n,则同样更危险,这会让用户空间有可能使内核崩溃。在这种情况下,您将不得不动态分配内存,而不是使用堆栈上的缓冲区。

至于如果 copy_from_user() 失败你会怎么做,用户对内核撒了谎,并将错误的信息传递给了内核。

处理该问题的正常方法是退出您正在执行的任何操作,并将 -EFAULT 传递回用户空间。

关于c - 如何处理来自 copy_from_user() 的页面错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26294391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com