В ядре Linux устранена следующая уязвимость: fs/ntfs3: зафиксировать тупик в ni_read_folio_cmpr Syzbot сообщил о задании, висешенном в ni_r…
В ядре Linux устранена следующая уязвимость: fs/ntfs3: зафиксировать тупик в ni_read_folio_cmpr Syzbot сообщил о задании, висешенном в ni_readpage_cmpr (теперь ni_read_folio_cmpr). Это вызвано инверсионным тупиком с участием иноде мутекса. (ni_lock) и блокировки страниц. Сценарий: 1. 1. Задача A вводит ntfs_read_folio() для страницы X. Он приобретает ni_lock. 2. 2. Задание A вызывает ni_read_folio_cmpr(), который пытается заблокировать все страницы в сжатый кадр (в том числе страница Y). 3. 3. Одновременно с заданием B (например, через readahead) заблокировано страницы Y и звонки ntfs_read_folio(). 4. Задание B ждет ni_lock (держит A). 5. Задание A ждет блокировку страницы Y (придерживается B). -> ТУПИК. Исправление заключается в реструктуризации блокировки: не берите ni_lock in ntfs_read_folio(). Вместо этого приобретите ni_lock внутри ni_read_folio_cmpr() ТОЛЬКО ПОСЛЕ всего необходимого Замки страниц для кадра были успешно приобретены. Это восстанавливает правильный заказ замка (Page Lock -> ni_lock) в соответствии с VFS. [almaz.alexandrovich@paragon-software.com: ni_readpage_cmpr был переименован в ni_read_folio_cmpr]