ключевой фрагмент функции /mm/fault.c, содержащий ошибку синхронизации
Поскольку, page fault handler выполняется с семафором, доступным только-на-чтение, несколько конкурирующих потока могут одновременно войти в обработчик за строкой /* * */. Рассмотрим, что произойдет, если два потока, разделяющих одну и туже виртуальную память, одновременно вызовут page fault handler. Приблизительный сценарий атаки выглядит так: поток 1 обращается к сторожевой странице и вызывает исключение fault_1. Поток 2, обращается к странице GUARD_PAGE + PAGE_SIZE и вызывает исключение fault_2.
Состояние виртуальной памяти при этом будет выглядеть так:
[ NOPAGE ] [fault_1 ] [ VMA ] --->
higher addresses[fault_2 ] [ NOPAGE ] [ VMA ]