Medium · published July 25, 2026
In the Linux kernel, the following vulnerability has been resolved:
cpufreq: Fix hotplug-suspend race during reboot
During system reboot, cpufreq_suspend() is called via the
kernel_restart() -> device_shutdown() path. Unlike the normal system
suspend path, the reboot path does not call freeze_processes(), so
userspace processes and kernel threads remain active.
This allows CPU hotplug operations to run concurrently with
cpufreq_suspend(). The original code has no synchronization with CPU
hotplug, leading to a race condition where governor_data can be freed
by the hotplug path while cpufreq_suspend() is still accessing it,
resulting in a null pointer dereference:
Unable to handle kernel NULL pointer dereference
Call Trace:
do_kernel_fault+0x28/0x3c
cpufreq_suspend+0xdc/0x160
device_shutdown+0x18/0x200
kernel_restart+0x40/0x80
arm64_sys_reboot+0x1b0/0x200
Fix this by adding cpus_read_lock()/cpus_read_unlock() to
cpufreq_suspend() to block CPU hotplug operations while suspend is in
progress.
[ rjw: Changelog edits ]
| Product | Versions | Fixed in |
|---|---|---|
| linux/linux_kernel | ≥ 4.4.198, < 4.5 | 4.5 |
| linux/linux_kernel | ≥ 4.9.198, < 4.10 | 4.10 |
| linux/linux_kernel | ≥ 4.14.151, < 4.15 | 4.15 |
| linux/linux_kernel | ≥ 4.19.81, < 4.20 | 4.20 |
| linux/linux_kernel | ≥ 5.3.8, < 5.4 | 5.4 |
| linux/linux_kernel | ≥ 5.4.1, < 5.10.261 | 5.10.261 |
| linux/linux_kernel | ≥ 5.11, < 5.15.212 | 5.15.212 |
| linux/linux_kernel | ≥ 5.16, < 6.1.178 | 6.1.178 |
| linux/linux_kernel | ≥ 6.2, < 6.6.145 | 6.6.145 |
| linux/linux_kernel | ≥ 6.7, < 6.12.96 | 6.12.96 |
| linux/linux_kernel | ≥ 6.13, < 6.18.39 | 6.18.39 |
| linux/linux_kernel | ≥ 6.19, < 7.1.4 | 7.1.4 |
| linux/linux_kernel | all versions | — |
| linux/linux_kernel | all versions | — |
| linux/linux_kernel | all versions | — |
| linux/linux_kernel | all versions | — |
| linux/linux_kernel | all versions | — |
| linux/linux_kernel | all versions | — |