{"id":28488,"date":"2026-09-25T00:31:32","date_gmt":"2026-09-24T16:31:32","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-93224"},"modified":"2026-09-25T00:31:32","modified_gmt":"2026-09-24T16:31:32","slug":"cve-2026-93224","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-93224","title":{"rendered":"CVE-2026-93224 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nsvcrdma: Fix unmatche"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>svcrdma: Fix unmatched rn_unregister on failed accept<\/p>\n<p>When svc_rdma_accept() takes the errout path before<br \/>\nrpcrdma_rn_register() has succeeded, the existing cleanup block<br \/>\ncalls rpcrdma_rn_unregister(dev, &amp;newxprt-&gt;sc_rn) unconditionally.<br \/>\nsvcxprt_rdma is kzalloc&#8217;d, so on that path sc_rn.rn_index is 0 and<br \/>\nsc_rn.rn_done is NULL; the unregister therefore xa_erase()s another<br \/>\ncaller&#8217;s slot 0 and performs an unmatched kref_put() on the<br \/>\nrpcrdma_device&#8217;s rd_kref.<\/p>\n<p>The same errout also brackets the cleanup with svc_xprt_get()\/<br \/>\nsvc_xprt_put() around the kref_init() birth reference. The kref<br \/>\ngoes 1 -&gt; 2 -&gt; 1 and never reaches 0, so the svcxprt_rdma (and the<br \/>\nnet\/ns_tracker it pinned) is leaked on every failed accept.<\/p>\n<p>rpcrdma_rn_register() writes rn-&gt;rn_done last, only after xa_alloc()<br \/>\nand kref_get() have both succeeded, so rn_done == NULL is a natural<br \/>\n&#8220;never registered&#8221; sentinel. Guard rpcrdma_rn_unregister() with an<br \/>\nearly return when rn_done is NULL, and clear rn_done before the<br \/>\nmatching xa_erase() so a repeated unregister is also a no-op.<\/p>\n<p>With that guard in place, the accept errout drops the kref_init()<br \/>\nbirth reference via svc_xprt_put(), which dispatches svc_rdma_free().<br \/>\nTeardown of sc_qp, sc_sq_cq, sc_rq_cq, and sc_pd runs under existing<br \/>\nIS_ERR\/NULL guards in svc_rdma_free(); sc_rn is covered by the new<br \/>\nrn_done sentinel; sc_cm_id is non-NULL on every errout path because<br \/>\nsvc_rdma_accept() dereferences it above the first goto errout.<\/p>\n<p>svc_xprt_free() drops the module reference associated with the freed<br \/>\ntransport, and svc_handle_xprt() drops its pre-acquired reference<br \/>\nwhen -&gt;xpo_accept() returns NULL. Take a replacement module reference<br \/>\nbefore svc_xprt_put() so the two module_put()s remain balanced.<\/p>\n<p>The rn_done guard also covers svc_rdma_free()&#8217;s non-listener call<br \/>\nto rpcrdma_rn_unregister() for transports whose register attempt<br \/>\nfailed or never ran.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>svcrdma: Fix unmatched rn_unregister on failed accept<\/p>\n<p>When svc_rdma_accept() takes the errout path before<br \/>\nrpcrdma_rn_register() ha<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-28488","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/28488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=28488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=28488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=28488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}