{"id":29225,"date":"2026-09-25T20:32:11","date_gmt":"2026-09-25T12:32:11","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98070"},"modified":"2026-09-25T20:32:11","modified_gmt":"2026-09-25T12:32:11","slug":"cve-2026-98070","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98070","title":{"rendered":"CVE-2026-98070 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/rds: acquire RDS_"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/rds: acquire RDS_IN_XMIT in rds_tcp_reset_callbacks()<\/p>\n<p>rds_tcp_reset_callbacks() quiesces the transmit path by setting the<br \/>\npath state to RDS_CONN_RESETTING and then waiting for RDS_IN_XMIT to<br \/>\nbe sampled clear before swapping the underlying socket and calling<br \/>\nrds_send_path_reset().<\/p>\n<p>Sampling the bit clear is not the same as owning it: rds_send_xmit()<br \/>\ncan re-acquire RDS_IN_XMIT right after the wait_event() returns.  Its<br \/>\nstate recheck after taking the lock is a store-buffering pattern (the<br \/>\nresetter writes the state and reads the bit, the sender writes the<br \/>\nbit and reads the state) and acquire_in_xmit() is only an acquire<br \/>\noperation, so on weakly ordered architectures both sides can miss<br \/>\neach other&#8217;s write and the transmit path then runs concurrently with<br \/>\nrds_send_path_reset() rewriting cp_xmit_* state &#8211; which is exactly<br \/>\nwhat the comment above rds_send_path_reset() tells its callers to<br \/>\nprevent.<\/p>\n<p>Take the lock instead, hold it across the socket swap and<br \/>\nrds_send_path_reset(), and release it with a wake-up at the end.  The<br \/>\nlock-ordering constraint documented above the wait still holds: the<br \/>\nlock is acquired before lock_sock(), so a sender inside tcp_sendmsg()<br \/>\ncan never be waited on while we hold the socket lock.<\/p>\n<p>Two details of the old code go away with the same change:<\/p>\n<p> &#8211; t_sock is now read only after the lock is acquired.  The old code<br \/>\n   cached it before waiting; the teardown in rds_conn_shutdown()<br \/>\n   releases that socket and clears t_sock, so a pointer cached before<br \/>\n   the wait can be stale by the time the accept path resumes.  Reading<br \/>\n   it under RDS_IN_XMIT is what makes the exclusion complete once the<br \/>\n   teardown owns the same lock, which the next patch arranges; until<br \/>\n   then the teardown still only samples the bit, and the two paths<br \/>\n   remain as exposed to each other as they are today.<\/p>\n<p> &#8211; The old !osock early path called rds_send_path_reset() with no<br \/>\n   serialization at all.  It now runs under the lock like the normal<br \/>\n   path.  The conditional RDS_CONN_RESETTING transition of the<br \/>\n   previous patch happens before the socket check either way: a path<br \/>\n   found without a socket is either still connecting (its reconnect<br \/>\n   worker blocked on t_conn_path_lock) and legitimately goes<br \/>\n   RESETTING -&gt; UP on the new socket, or it has been torn down<br \/>\n   meanwhile and is dropped.<\/p>\n<p>The in-function comment describing the old wait-based quiesce is<br \/>\nrewritten to describe the lock-based one, and the stale block comment<br \/>\nabove the function (which still described a return value and an<br \/>\nincomplete list of t_sock writers) is refreshed to name all four<br \/>\nwriters &#8211; the connect, accept, teardown and swap paths &#8211; and what<br \/>\nserializes each of them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/rds: acquire RDS_IN_XMIT in rds_tcp_reset_callbacks()<\/p>\n<p>rds_tcp_reset_callbacks() quiesces the transmit path by setting the<br \/>\npath<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-29225","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/29225","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=29225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}