CVE-2026-64281 in Linux
Сводка
по VulDB • 26.07.2026
В ядре Linux устранена следующая уязвимость:
svcrdma: пробуждение ожидающих потоков в очереди sq при закрытии транспорта
Потоки, заблокированные в функции svc_rdma_sq_wait() на ожиданиях sc_sq_ticket_wait или sc_send_wait, могут зависать бесконечно в состоянии TASK_UNINTERRUPTIBLE во время разборки (teardown) транспорта. Это приводит к удержанию ссылок на объект svc_xprt и блокировке вызова svc_rdma_free().
Путь закрытия устанавливает флаг XPT_CLOSE перед вызовом xpo_detach, а оба предиката wait_event включают проверку флага XPT_CLOSE. Однако эти предикаты перепроверяются только при пробуждении потока. Для sc_sq_ticket_wait отсутствует путь пробуждения по завершению операции (completion-driven wake path); он продвигается исключительно за счет цепочечной передачи тикета внутри самой функции svc_rdma_sq_wait(). Без явного пробуждения в момент закрытия заблокированные потоки никогда не увидят флаг XPT_CLOSE, будут бесконечно удерживать ссылку на объект через svc_xprt_get(), и вызов svc_rdma_free() будет блокироваться до тех пор, пока счетчик ссылок xpt_ref не упадет до нуля.
Существует две точки входа в закрытие этого транспорта. Локальная разборка выполняется функцией svc_rdma_detach(), которая вызывается из svc_handle_xprt() -> svc_delete_xprt() -> xpo_detach на рабочем потоке (worker thread). Удаленное отключение обрабатывается в функции svc_rdma_cma_handler(), которая вызывает svc_xprt_deferred_close(): эта функция устанавливает флаг XPT_CLOSE и ставит транспорт в очередь, но не обращается ни к одной из очередей ожидания RDMA. В результате рабочий поток, уже заблокированный в svc_rdma_sq_wait(), никогда не перепроверяет свой предикат. Поскольку все рабочие потоки заблокированы на этом транспорте, нет доступных потоков для выполнения локальной разборки, а точка пробуждения там становится недостижимой.
Введена функция svc_rdma_xprt_deferred_close() — легкая обертка svcrdma, которая вызывает svc_xprt_deferred_close(), а затем пробуждает как sc_sq_ticket_wait, так и sc_send_wait. Производители в модуле svcrdma, которые ранее вызывали svc_xprt_deferred_close() напрямую (svc_rdma_cma_handler(), qp_event_handler(), svc_rdma_post_send_err(), svc_rdma_wc_send(), путь сброса sendto, пути ошибок завершения операций чтения/записи, а также пути очистки и ошибки при чтении из recvfrom), теперь используют новую функцию.
Также добавлено пробуждение обеих очередей ожидания из функции svc_rdma_detach(). Синхронный путь вызова svc_xprt_close() (обратный канал с ошибкой ENOTCONN, удаление устройства через svc_rdma_xprt_done) достигает точки detach без прохождения через svc_xprt_deferred_close(), поэтому новая вспомогательная функция в этом случае не вызывается.
[ cel: добавлена svc_rdma_xprt_deferred_close() для завершения исправления ]
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.