{"id":21455,"date":"2026-09-12T04:31:12","date_gmt":"2026-09-11T20:31:12","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89533"},"modified":"2026-09-12T04:31:12","modified_gmt":"2026-09-11T20:31:12","slug":"cve-2026-89533","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89533","title":{"rendered":"CVE-2026-89533 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nsvcrdma: Fix offset a"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>svcrdma: Fix offset arithmetic in read_chunk_range<\/p>\n<p>svc_rdma_read_chunk_range() walks a Read chunk&#8217;s segment list to<br \/>\nbuild a sub-range starting at byte offset and spanning length bytes<br \/>\nfor a Position-Zero or Call chunk. Two arithmetic defects in the<br \/>\nper-segment loop produce wrong DMA lengths and a u32 underflow:<\/p>\n<p>    pcl_for_each_segment(segment, chunk) {<br \/>\n            if (offset &gt; segment-&gt;rs_length) {<br \/>\n                    offset -= segment-&gt;rs_length;<br \/>\n                    continue;<br \/>\n            }<\/p>\n<p>            dummy.rs_handle = segment-&gt;rs_handle;<br \/>\n            dummy.rs_length = min_t(u32, length,<br \/>\n                                    segment-&gt;rs_length) &#8211; offset;<br \/>\n            dummy.rs_offset = segment-&gt;rs_offset + offset;<\/p>\n<p>First, the skip predicate uses &#8216;&gt;&#8217; instead of &#8216;&gt;=&#8217;. When offset<br \/>\nequals the segment&#8217;s full rs_length, the segment is fully consumed<br \/>\nand should be skipped, but the loop falls through into the body.<br \/>\nThe resulting dummy.rs_length is min_t(u32, length, rs_length) &#8211;<br \/>\nrs_length, which underflows to a near-UINT_MAX u32 when length is<br \/>\nsmaller than rs_length, or is zero otherwise.<\/p>\n<p>Second, the length formula subtracts offset from the min_t() result<br \/>\nrather than from segment-&gt;rs_length before the cap. For offset &gt; 0<br \/>\nthe segment&#8217;s residual is rs_length &#8211; offset, not rs_length, so the<br \/>\ncap must be applied to the residual. With the current bracketing,<br \/>\nwhenever length is smaller than rs_length &#8211; offset the per-segment<br \/>\nlength becomes length &#8211; offset instead of length, silently dropping<br \/>\noffset bytes from the rebuilt chunk. Combined with the boundary<br \/>\ncase above it also enables the u32 underflow path, which propagates<br \/>\na huge nr_bvec into svc_rdma_build_read_segment() and a multi-MiB<br \/>\nkmalloc_array_node() in svc_rdma_get_rw_ctxt().<\/p>\n<p>Additionally, svc_rdma_read_call_chunk() can invoke this function<br \/>\nwith length == 0 when the last Read chunk ends exactly at the end<br \/>\nof the Call chunk. With the corrected &gt;= predicate, every segment<br \/>\nis skipped and the function returns the initial -EINVAL, rejecting<br \/>\na valid request. Return success immediately when length is zero.<br \/>\nAlso break out of the loop once length is fully consumed to avoid<br \/>\npassing zero-length segments to svc_rdma_build_read_segment().<\/p>\n<p>Fix by using &#8216;&gt;=&#8217; so a fully-consumed segment is skipped, by<br \/>\nmoving &#8216;- offset&#8217; inside min_t() so the cap is applied to the<br \/>\nsegment&#8217;s residual length, by returning success for zero-length<br \/>\nrequests, and by stopping iteration when the requested range has<br \/>\nbeen consumed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>svcrdma: Fix offset arithmetic in read_chunk_range<\/p>\n<p>svc_rdma_read_chunk_range() walks a Read chunk&#8217;s segment list to<br \/>\nbuild a sub-ra<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21455","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21455","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=21455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}