KernelScan.io

HIGH Introduced in 3.15

rtl2832_sdr StartStreaming OOB

CVE-2026-89880

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI6.5MEDIUM

01

In the Linux kernel, the following vulnerability has been resolved: media: rtl2832_sdr: release URBs and stream buffers on start_streaming() failure rtl2832_sdr_start_streaming() calls rtl2832_sdr_alloc_stream_bufs(), rtl2832_sdr_alloc_urbs() and rtl2832_sdr_submit_urbs() in sequence and shares a single err: label that only unlocks the mutex and returns. When alloc_urbs() succeeds but submit_urbs() fails, or when alloc_urbs() itself returns -ENOMEM after alloc_stream_bufs() has already succeeded, the URBs and/or the coherent DMA stream buffers stay allocated while streaming reports failure to vb2. Two latent defects follow on the next VIDIOC_STREAMON: 1) rtl2832_sdr_alloc_stream_bufs() unconditionally resets dev->buf_num to 0 and overwrites dev->buf_list[]/dev->dma_addr[], permanently leaking the coherent DMA memory allocated by the previous attempt. 2) rtl2832_sdr_alloc_urbs() never resets dev->urbs_initialized and only increments it. After a second successful pass urbs_initialized can exceed MAX_BULK_BUFS, so the subsequent rtl2832_sdr_free_urbs() walks from urbs_initialized - 1 down to 0 and reads past the end of dev->urb_list[], passing garbage pointers to usb_free_urb(). Mirror the teardown that stop_streaming() already performs: on the error path call rtl2832_sdr_free_urbs() and rtl2832_sdr_free_stream_bufs() before unlocking. Both helpers are idempotent (free_urbs kills and zeros urbs_initialized; free_stream_bufs is gated on URB_BUF and clears the buf_num counter), so partial-failure paths and the no-allocation paths remain safe. Issue identified by automated review of the INV-003 series at https://sashiko.dev/

02

Engine v0.6.0

Risk summary

A USB SDR driver fails to release URBs and DMA buffers when streaming startup fails, leaving stale state that on a subsequent streaming attempt causes an out-of-bounds array access and passes garbage pointers to usb_free_urb(). An attacker with physical access to a USB port and a malicious or faulty RTL2832-based SDR device can trigger memory corruption, potentially leading to code execution or a kernel crash.

Affecteddrivers/media/dvb-frontends/rtl2832_sdr.c (rtl2832_sdr SDR driver)

Vulnerability analysis

When starting streaming on this USB software-defined-radio driver, a failure partway through allocation leaves URBs and DMA buffers allocated while reporting failure to the video framework. On the next streaming attempt, the driver does not reset its counters, causing it to read past the end of an internal array and pass invalid pointers to the USB deallocation code, leading to memory corruption. The fix cleans up any partial allocations on the error path before returning, matching the existing stop-streaming behavior. An attacker needs physical access to attach a compatible RTL2832-based USB device and an ordinary local account with access to the device node to open it and start streaming.

03

BranchIntroducedFixed inPatch commit
5.103.155.10.270f14a713a36a5
5.153.155.15.221c819dea3a433
6.13.156.1.1880337ab075928
6.123.156.12.1108bcf11a239ea
6.183.156.18.5126a2a985bbee
6.63.156.6.157c91e8ae2b39c
7.23.157.2.5ac02b2c56cce
mainline3.157.3fe50cdaebf12
cip/5.103.155.10.271-cip78f14a713a36a5
cip/6.13.156.1.189-cip610337ab075928
cip/6.1-rt3.156.1.189-cip61-rt320337ab075928
cip/6.123.156.12.111-cip328bcf11a239ea

04

State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.

CIP treeState
cip/6.12Fixed in 6.12.111-cip32
cip/6.1Fixed in 6.1.189-cip61
cip/6.1-rtFixed in 6.1.189-cip61-rt32
cip/5.10Fixed in 5.10.271-cip78
cip/5.10-rtAffected — no CIP fix yet (latest 5.10.268-cip77-rt34)
cip/4.19Affected — no CIP fix yet (latest 4.19.325-cip136)
cip/4.19-rtAffected — no CIP fix yet (latest 4.19.325-cip136-rt50)
cip/4.4Affected — no CIP fix yet (latest 4.4.302-cip115)
cip/4.4-rtAffected — no CIP fix yet (latest 4.4.302-cip115-rt63)