我有以下系统调用:
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
的非零值(我认为是因为页面错误)。
如何强制复制成功。换句话说,如果系统调用返回非零值,我该怎么办?
答案 0 :(得分:4)
在堆栈上分配大数组不是你应该或者真的可以做的事情。 linux内核使用小堆栈运行,通常是2个内存页面。如果您的char tmp[n];
依赖来自用户空间的n
,让用户空间可能导致内核崩溃,则同样更危险。在这种情况下,你必须动态分配内存而不是在堆栈上使用缓冲区。
如果copy_from_user()失败,你会做什么,用户已经对内核撒谎,并将错误传递给内核。
处理这种情况的正常方法是拯救你正在执行的任何事情,并将-EFAULT传递回用户空间。