---
id: CVE-2026-89533
title: 'svcrdma: Fix offset arithmetic in read_chunk_range'
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  svcrdma: Fix offset arithmetic in read_chunk_range

  svc_rdma_read_chunk_range() walks a Read chunk's segment list to
  build a sub-range starting at byte offset and spann…
severity: critical
cvss: 9.8
cvssVector: 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H'
cvssSource: cna
cwe:
  - CWE-191
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    10873311f91db9454e2fadbf9866bc819e0646d9
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    addbf02dfe3b25e7e38e03bbd4e2a6ed86a14be7
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    cba8543c18cf42fd80fd63effb6df6ff4f7e73ce
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    6ee4dc7476b3abc92ec1d444533a559f33f59561
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    a46b35f213c2426f5d6a0458a8f7e873fc59cdfd
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    4493c96bbd0068fadf69cbae8d13426202e34cdc
  - >-
    Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 <
    4a44c140cc2f3643a39e258bb0c0ab9d0f494f5e
  - Linux 5.11
ssvc:
  exploitation: none
  automatable: 'yes'
  technicalImpact: total
  timestamp: '2026-10-16T19:23:13.656876Z'
published: '2026-09-11'
updated: '2026-10-19'
sourceUpdated: '2026-10-19T08:48:24.875Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-89533'
references:
  - url: 'https://git.kernel.org/stable/c/10873311f91db9454e2fadbf9866bc819e0646d9'
  - url: 'https://git.kernel.org/stable/c/addbf02dfe3b25e7e38e03bbd4e2a6ed86a14be7'
  - url: 'https://git.kernel.org/stable/c/cba8543c18cf42fd80fd63effb6df6ff4f7e73ce'
  - url: 'https://git.kernel.org/stable/c/6ee4dc7476b3abc92ec1d444533a559f33f59561'
  - url: 'https://git.kernel.org/stable/c/a46b35f213c2426f5d6a0458a8f7e873fc59cdfd'
  - url: 'https://git.kernel.org/stable/c/4493c96bbd0068fadf69cbae8d13426202e34cdc'
  - url: 'https://git.kernel.org/stable/c/4a44c140cc2f3643a39e258bb0c0ab9d0f494f5e'
  - url: >-
      https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89533.json
  - url: 'https://access.redhat.com/security/cve/CVE-2026-89533'
  - url: 'https://bugzilla.redhat.com/show_bug.cgi?id=2532058'
  - url: 'https://www.cve.org/CVERecord?id=CVE-2026-89533'
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2026-89533'
  - url: >-
      https://git.kernel.org/pub/scm/linux/security/vulns.git/plain/cve/published/2026/CVE-2026-89533.mbox
tags:
  - cve.org
  - csaf
  - vex
  - red-hat
  - score-dispute
epss: 0.00502
epssPercentile: 0.42784
scores:
  cna: 9.8
  vendor: 7
ingestedAt: '2026-09-14T15:23:07.452Z'
---

## Overview

In the Linux kernel, the following vulnerability has been resolved:

svcrdma: Fix offset arithmetic in read_chunk_range

svc_rdma_read_chunk_range() walks a Read chunk's segment list to
build a sub-range starting at byte offset and spanning length bytes
for a Position-Zero or Call chunk. Two arithmetic defects in the
per-segment loop produce wrong DMA lengths and a u32 underflow:

    pcl_for_each_segment(segment, chunk) {
            if (offset > segment->rs_length) {
                    offset -= segment->rs_length;
                    continue;
            }

            dummy.rs_handle = segment->rs_handle;
            dummy.rs_length = min_t(u32, length,
                                    segment->rs_length) - offset;
            dummy.rs_offset = segment->rs_offset + offset;

First, the skip predicate uses '>' instead of '>='. When offset
equals the segment's full rs_length, the segment is fully consumed
and should be skipped, but the loop falls through into the body.
The resulting dummy.rs_length is min_t(u32, length, rs_length) -
rs_length, which underflows to a near-UINT_MAX u32 when length is
smaller than rs_length, or is zero otherwise.

Second, the length formula subtracts offset from the min_t() result
rather than from segment->rs_length before the cap. For offset > 0
the segment's residual is rs_length - offset, not rs_length, so the
cap must be applied to the residual. With the current bracketing,
whenever length is smaller than rs_length - offset the per-segment
length becomes length - offset instead of length, silently dropping
offset bytes from the rebuilt chunk. Combined with the boundary
case above it also enables the u32 underflow path, which propagates
a huge nr_bvec into svc_rdma_build_read_segment() and a multi-MiB
kmalloc_array_node() in svc_rdma_get_rw_ctxt().

Additionally, svc_rdma_read_call_chunk() can invoke this function
with length == 0 when the last Read chunk ends exactly at the end
of the Call chunk. With the corrected >= predicate, every segment
is skipped and the function returns the initial -EINVAL, rejecting
a valid request. Return success immediately when length is zero.
Also break out of the loop once length is fully consumed to avoid
passing zero-length segments to svc_rdma_build_read_segment().

Fix by using '>=' so a fully-consumed segment is skipped, by
moving '- offset' inside min_t() so the cap is applied to the
segment's residual length, by returning success for zero-length
requests, and by stopping iteration when the requested range has
been consumed.

## Affected

- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < 10873311f91db9454e2fadbf9866bc819e0646d9`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < addbf02dfe3b25e7e38e03bbd4e2a6ed86a14be7`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < cba8543c18cf42fd80fd63effb6df6ff4f7e73ce`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < 6ee4dc7476b3abc92ec1d444533a559f33f59561`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < a46b35f213c2426f5d6a0458a8f7e873fc59cdfd`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < 4493c96bbd0068fadf69cbae8d13426202e34cdc`
- `Linux >= d7cc73972661be4a02a1b09f1d9b3283c6c05154 < 4a44c140cc2f3643a39e258bb0c0ab9d0f494f5e`
- `Linux 5.11`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.

## Vendor advisories

- **Red Hat VEX** · Moderate · affected: Red Hat Enterprise Linux 10, Red Hat Enterprise Linux 8, Red Hat Enterprise Linux 9, Red Hat OpenShift Container Platform 4 · no fix planned: Red Hat Enterprise Linux 10, Red Hat Enterprise Linux 8, Red Hat Enterprise Linux 9, Red Hat OpenShift Container Platform 4 · updated 2026-09-14 · [vex](https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89533.json)
