В Пример 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
в указатель пользовательского пространства. Напротив, это неправильно ...
Итак, что произойдет, если я передам очень большое значение, которое можно перевести как адрес ядра? В этой ситуации будет 'access_ok()' return false? или, даже, паника ядра? Более того, на некоторых архитектурах 'access_ok()' просто вернет 1 и больше ничего не сделает. но на X86, что сделано, чем просто вернуть 1? –
Если вы передадите адрес ядра 'access_ok', он вернет false. – Tsyvarev