Правильный способ использовать copy_to_user? - PullRequest
3 голосов
/ 03 декабря 2009

Я пытаюсь определить системный вызов, который изменяет буфер символов, передаваемый ему. Конкретно как то так:

...
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 ]

8 голосов
/ 19 сентября 2010

Помните, что tmp уже является указателем! Правильный способ сделать это:

copy_to_user( buff, tmp, len );
5 голосов
/ 03 декабря 2009

Это выглядит хорошо. Возможно, что буфер, который передал пользовательское пространство, отображается только для чтения - например, если он находится в текстовом сегменте (например, строковый литерал). Кстати, это, вероятно, то, что вы хотите:

return copy_to_user(buff, &tmp, len) ? -EFAULT : 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...