В ядре Linux устранена следующая уязвимость:
предохранитель: публиковать очереди ввода-вывода с семантикой выпуска
Fuse_uring_create_queue() инициализирует Fuse_ring_queue, а затем
публикует указатель в кольцо->очереди[qid] с помощью WRITE_ONCE() под
fch->блокировка. Есть несколько читателей, которые могут одновременно привлекать
этот указатель заблокирован, а затем уважает его.
WRITE_ONCE() не обеспечивает порядок поля очереди
инициализация перед назначением указателя Ring->queues[qid].
очередь должна быть опубликована с помощью smp_store_release(), чтобы поле
инициализация гарантированно произойдет раньше.
Читатели в путях, где чтение может происходить одновременно с хранилищем.
необходимо использовать READ_ONCE(), потому что любая гонка, включающая простой доступ,
неопределенный.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: fuse: publish io-uring queues with release semantics fuse_uring_create_queue() initializes a fuse_ring_queue and then publishes the pointer into ring->queues[qid] with WRITE_ONCE() under the fch->lock. There are several readers that may concurrently be fetching that pointer locklessly and then deferencing it. WRITE_ONCE() doesn't ensure ordering of the queue's field initialization before the ring->queues[qid] pointer assignment. The queue must be published with smp_store_release() so the field initialization is guaranteed to happen before. Readers in paths where the read may happen concurrently with the store need to use READ_ONCE() because any race involving a plain access is undefined.