Прохождение кода 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,

В заключение все это означает, что данный вопрос будет достигнут, если:

  1. адрес недействителен, но проскальзывает мимо access_ok, или же
  2. это действительно, но в настоящее время заменено.
Другие вопросы по тегам