2015-06-16 4 views
0

В Пример LDD3, access_ok() размещен в начале ioctl метод модуля ядра, чтобы проверить, действительно ли указатель прошел из пользовательского пространства. Это правильно, когда приложение userpace вызывает системный вызов ioctl() и передает ему адрес переменной. Однако в некоторых случаях системный вызов ioctl() вызывается со значением вместо указателя в качестве третьего аргумента и, наконец, вторым аргументом access_ok() в модуле ядра.Могу ли я передать целое число в `access_ok()`, поскольку это второй аргумент?

Я попытался передать целое число как второй аргумент access_ok(), и он отлично работает. Об ошибках не сообщалось. Но я не очень уверен, что это правильное использование?

Например, если я вызываю ioctl() в пользовательском пространстве, а третий аргумент равен '3'. Затем в ioctl() метод struct file_operations, access_ok() получит 3, поскольку это второй аргумент. Потому что access_ok() ожидает указатель, поэтому он переводит 3 в указатель пользовательского пространства. Напротив, это неправильно ...

ответ

0

На самом деле, проверка access_ok «s груба. Описание функции (в исходном файле) сказать:

Обратите внимание, что, в зависимости от архитектуры, эта функция, вероятно, просто проверяет, что указатель находится в пределах пользовательского пространства - после вызова этой функции, функции доступа к памяти может все еще вернуть -EFAULT.

Э.Г., в зависимости от источника arch/x86/include/asm/uaccess.h, на x86 access_ok просто проверяет, что данный адрес указывает на ниже области (потому что ядро ​​кроме того, в верхней части). Таким образом, он возвращает true для адреса, равного 3.

Это copy_from_user/copy_to_user, которые вернут окончательный вердикт о доступности пользовательской памяти.

+0

Итак, что произойдет, если я передам очень большое значение, которое можно перевести как адрес ядра? В этой ситуации будет 'access_ok()' return false? или, даже, паника ядра? Более того, на некоторых архитектурах 'access_ok()' просто вернет 1 и больше ничего не сделает. но на X86, что сделано, чем просто вернуть 1? –

+0

Если вы передадите адрес ядра 'access_ok', он вернет false. – Tsyvarev

0

Программы для использования в пространстве пользователя могут дать вам любое случайное значение в качестве указателя, поэтому access_ok() должно иметь возможность обрабатывать любое случайное значение. Таким образом, вполне нормально позвонить access_ok() с не указательным значением.

Однако, если вы на самом деле не попытаетесь получить доступ к этой ячейке памяти, вызов access_ok() совершенно бессмысленен. (на то пошло, вы должны, если это возможно, избегать access_ok() и просто проверить фактические доступы (пользовательском пространстве get_user() и т.д.) на наличие ошибок.)

 Смежные вопросы

  • Нет связанных вопросов^_^