我正在尝试定义一个系统调用来修改传递给它的字符缓冲区。具体来说,这样的事情:
...
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,来自调用程序的缓冲区保持不变。发生了什么事?
答案 0 :(得分:8)
请记住,tmp已经是一个指针! 正确的方法:
copy_to_user( buff, tmp, len );
答案 1 :(得分:5)
看起来不错。用户空间传递的缓冲区可能是以只读方式映射的 - 例如,如果它位于文本段中(例如,字符串文字)。顺便说一句,这可能是你想要的:
return copy_to_user(buff, &tmp, len) ? -EFAULT : 0;