CVE-2026-64281 in Linux
摘要
由 VulDB • 2026-07-25
在 Linux 内核中,已修复以下漏洞:
svcrdma:传输关闭时唤醒 sq 等待者
停在 `svc_rdma_sq_wait()` 中的线程(位于 `sc_sq_ticket_wait` 或 `sc_send_wait`)可能会在 TASK_UNINTERRUPTIBLE 状态下无限期挂起,导致 svc_xprt 引用被固定住并阻塞 `svc_rdma_free()`。
关闭路径会在调用 xpo_detach 之前设置 XPT_CLOSE,且两个 wait_event 谓词都包含一个 XPT_CLOSE 项,但只有在唤醒时才会重新评估这些谓词。`sc_sq_ticket_wait` 没有基于完成事件的唤醒路径;它仅由 `svc_rdma_sq_wait()` 内部的链接票证传递机制推进。如果没有在关闭时显式发送唤醒信号,停放的线程将永远无法观察到 XPT_CLOSE,永久持有其 svc_xprt_get 引用,并且由于 xpt_ref 未降至零,`svc_rdma_free()` 会一直阻塞。
有两个关闭入口点会导致此传输问题。本地拆卸从 worker 线程上的 `svc_handle_xprt() -> svc_delete_xprt() -> xpo_detach()` 运行 `svc_rdma_detach()`。远程断开连接到达 `svc_rdma_cma_handler()`,该函数调用 `svc_xprt_deferred_close()`:这会设置 XPT_CLOSE 并将传输入队,但不会访问任何 RDMA waitqueue,因此已经停在 `svc_rdma_sq_wait()` 中的 worker 永远不会重新评估其谓词。由于所有 worker 都停在这个传输上,没有线程可用于运行本地拆卸,且那里的唤醒点不可达。
引入 `svc_rdma_xprt_deferred_close()`,这是一个轻量级的 svcrdma 包装器,它调用 `svc_xprt_deferred_close()`,然后同时唤醒 `sc_sq_ticket_wait` 和 `sc_send_wait`。转换直接调用 `svc_xprt_deferred_close()` 的 svcrdma 生产者: - svc_rdma_cma_handler() - qp_event_handler() - svc_rdma_post_send_err() - svc_rdma_wc_send() - sendto 丢弃路径 - rw 完成错误路径 - recvfrom 刷新和 read-list 错误路径
同时从 `svc_rdma_detach()` 唤醒两个 waitqueue。同步的 `svc_xprt_close()` 路径(backchannel 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.