CVE-2026-31726
Severity CVSS v4.0:
Pending analysis
Type:
CWE-476
NULL Pointer Dereference
Publication date:
01/05/2026
Last modified:
07/05/2026
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
usb: gadget: uvc: fix NULL pointer dereference during unbind race<br />
<br />
Commit b81ac4395bbe ("usb: gadget: uvc: allow for application to cleanly<br />
shutdown") introduced two stages of synchronization waits totaling 1500ms<br />
in uvc_function_unbind() to prevent several types of kernel panics.<br />
However, this timing-based approach is insufficient during power<br />
management (PM) transitions.<br />
<br />
When the PM subsystem starts freezing user space processes, the<br />
wait_event_interruptible_timeout() is aborted early, which allows the<br />
unbind thread to proceed and nullify the gadget pointer<br />
(cdev->gadget = NULL):<br />
<br />
[ 814.123447][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind()<br />
[ 814.178583][ T3173] PM: suspend entry (deep)<br />
[ 814.192487][ T3173] Freezing user space processes<br />
[ 814.197668][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind no clean disconnect, wait for release<br />
<br />
When the PM subsystem resumes or aborts the suspend and tasks are<br />
restarted, the V4L2 release path is executed and attempts to access the<br />
already nullified gadget pointer, triggering a kernel panic:<br />
<br />
[ 814.292597][ C0] PM: pm_system_irq_wakeup: 479 triggered dhdpcie_host_wake<br />
[ 814.386727][ T3173] Restarting tasks ...<br />
[ 814.403522][ T4558] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000030<br />
[ 814.404021][ T4558] pc : usb_gadget_deactivate+0x14/0xf4<br />
[ 814.404031][ T4558] lr : usb_function_deactivate+0x54/0x94<br />
[ 814.404078][ T4558] Call trace:<br />
[ 814.404080][ T4558] usb_gadget_deactivate+0x14/0xf4<br />
[ 814.404083][ T4558] usb_function_deactivate+0x54/0x94<br />
[ 814.404087][ T4558] uvc_function_disconnect+0x1c/0x5c<br />
[ 814.404092][ T4558] uvc_v4l2_release+0x44/0xac<br />
[ 814.404095][ T4558] v4l2_release+0xcc/0x130<br />
<br />
Address the race condition and NULL pointer dereference by:<br />
<br />
1. State Synchronization (flag + mutex)<br />
Introduce a &#39;func_unbound&#39; flag in struct uvc_device. This allows<br />
uvc_function_disconnect() to safely skip accessing the nullified<br />
cdev->gadget pointer. As suggested by Alan Stern, this flag is protected<br />
by a new mutex (uvc->lock) to ensure proper memory ordering and prevent<br />
instruction reordering or speculative loads. This mutex is also used to<br />
protect &#39;func_connected&#39; for consistent state management.<br />
<br />
2. Explicit Synchronization (completion)<br />
Use a completion to synchronize uvc_function_unbind() with the<br />
uvc_vdev_release() callback. This prevents Use-After-Free (UAF) by<br />
ensuring struct uvc_device is freed after all video device resources<br />
are released.
Impact
Base Score 3.x
5.50
Severity 3.x
MEDIUM
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.10.117 (including) | 5.10.253 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.15.41 (including) | 5.15.203 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.18 (including) | 6.1.168 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (including) | 6.6.134 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.12.81 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.13 (including) | 6.18.22 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.19 (including) | 6.19.12 (excluding) |
| cpe:2.3:o:linux:linux_kernel:7.0:rc1:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:7.0:rc2:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:7.0:rc3:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:7.0:rc4:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:7.0:rc5:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:7.0:rc6:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/0587de744615628c38e33ddc1601160a5ea8c50a
- https://git.kernel.org/stable/c/0c00ec409d7b2bce3fcac73188b79a141db7cfda
- https://git.kernel.org/stable/c/1aa9356881ee4ed414bf72d0c56d915492cb5345
- https://git.kernel.org/stable/c/8a1128d604c360eca135f15b882b70256a522145
- https://git.kernel.org/stable/c/c038ba56b92e410d1caec22b2dc68780a0b42091
- https://git.kernel.org/stable/c/c78e463ee134b4669579d453c81ae00795e4c19a
- https://git.kernel.org/stable/c/d92d1532e05b1b31d36d48765e43bf73d793d19f
- https://git.kernel.org/stable/c/eba2936bbe6b752a31725a9eb5c674ecbf21ee7d



