Прохождение кода Futex - возвращение EFAULT
В futex_wake_op function
файла futex.c в исходном коде ядра Linux, я пытался понять, как элемент управления достигает этой точки. Это происходит, когда в вышеупомянутой функции futex_atomic_op_inuser
возвращает -EFAULT, и все же uaddr2
доступно для записи.
Но из источника futex_atomic_op_inuser
Я вижу, что он возвращает -EFAULT только на if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
,
futex_atomic_op_inuser
в свою очередь называет __futex_atomic_op
макрос, в котором я вижу -EFAULT в коде, но мне говорят, что путь к EFAULT не требует вызова __futex_atomic_op
Как элемент управления достигает вышеупомянутой точки (то есть,если (! Fshared) goto retry_private;) тогда?
Заранее спасибо!
1 ответ
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
, или же - это действительно, но в настоящее время заменено.