access_ok
предназначен только для проверки того, является ли диапазон адресов действительным для данного доступа, и даже для этого он не всегда может дать определенный ответ.Смотрите комментарии в источнике:
* Returns true (nonzero) if the memory block may be valid, false (zero)
* if it is definitely invalid.
*
* Note that, depending on architecture, this function probably just
* checks that the pointer is in the user space range - after calling
* this function, memory access functions may still return -EFAULT.
Далее, даже если блок действителен, он может отсутствовать в памяти (выгружен).futex_atomic_op_inuser
вызывает pagefault_disable
, что отключает обычный процесс замены, так что вы получите серьезную ошибку, возвращая -EFAULT
из __futex_atomic_op
.
В заключение все это означает, что рассматриваемый вопрос будетдостигается, если:
- адрес недействителен, но проскальзывает после проверки в
access_ok
, или - , он действителен, но в настоящее время заменен.