Пример "copy_from_user" в ядре Linux (просто копирование указателя на int) - PullRequest
0 голосов
/ 28 января 2019

Я знаю, что есть много постов по этому вопросу, но большинство из них очень сложные, и я надеюсь, что кто-то может помочь мне с моим простым примером.

Я пишу системный вызов, и функция, которую я пишу, имеет вид:

SYS_CALLDEFINE4(calc, int, param1, int, param2, char, operation, int*, result) 
{
//Do system call stuff here
} 

Я знаю, что указатель на int будет проблемой, потому что приложение в пользовательском пространствемог бы передать указатель на жизненно важное системное пространство (и мы не хотим возиться с этим).Поэтому мне нужно использовать функцию copy_from_user.

Может ли кто-нибудь привести пример того, как правильно использовать эти две функции в контексте проверки правильности доступа к этому указателю?

1 Ответ

0 голосов
/ 29 января 2019

Замена для

*result = <value>;

будет

int local_value = <value>;
if (copy_to_user(&local_value, result, sizeof(*result)))
{
    // 'result' points to inaccessible memory.
}
// assigning 'result' has been successful.

В качестве альтернативы, поскольку размер result небольшой (int в вашем случае), вы можете использовать put_user, что проще и эффективнее:

if (put_user(<value>, result) < 0)
{
    // 'result' points to inaccessible memory.
}
// assigning 'result' has been successful.
...