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

时间:2014-10-10 07:49:12

标签: c linux memory linux-kernel operating-system

我有以下系统调用:

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的非零值(我认为是因为页面错误)。

如何强制复制成功。换句话说,如果系统调用返回非零值,我该怎么办?

1 个答案:

答案 0 :(得分:4)

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

如果copy_from_user()失败,你会做什么,用户已经对内核撒谎,并将错误传递给内核。

处理这种情况的正常方法是拯救你正在执行的任何事情,并将-EFAULT传递回用户空间。