使用copy_to_user的正确方法?

时间:2009-12-02 23:19:09

标签: c linux-kernel

我正在尝试定义一个系统调用来修改传递给它的字符缓冲区。具体来说,这样的事情:

...
asmlinkage int sys_mycall( char __user *buff, int len )
{
   char tmp[1000];
   copy_from_user(tmp, buff, len);
   /* change tmp here */
   copy_to_user( buff, &tmp, len );
}

这里,copy_to_user返回-1,来自调用程序的缓冲区保持不变。发生了什么事?

2 个答案:

答案 0 :(得分:8)

请记住,tmp已经是一个指针! 正确的方法:

copy_to_user( buff, tmp, len );

答案 1 :(得分:5)

看起来不错。用户空间传递的缓冲区可能是以只读方式映射的 - 例如,如果它位于文本段中(例如,字符串文字)。顺便说一句,这可能是你想要的:

return copy_to_user(buff, &tmp, len) ? -EFAULT : 0;