В ядре Linux устранена следующая уязвимость:
cpufreq: intel_pstate: исправлен сбой во время отключения турбо. Когда система загружается с аргументом командной строки ядра «nosmt» или
«maxcpus», чтобы ограничить количество процессоров, отключив турбо через:
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
приводит к сбою:
PF: доступ супервизора на чтение в режиме ядра
PF: error_code(0x0000) — страница отсутствует
ПГД 0 П4Д 0
К сожалению: К сожалению: 0000 [#1] SMP PTI
... RIP: 0010:store_no_turbo+0x100/0x1f0
...
Это происходит потому, что for_each_possible_cpu() возвращает значения процессоров, даже если они
не онлайн. Для этих процессоров all_cpu_data[] будет иметь значение NULL. Поскольку
commit 973207ae3d7c ("cpufreq: intel_pstate: Изменить максимальную частоту
код обработки обновлений"), all_cpu_data[] разыменовывается даже для процессоров
которые не находятся в сети, что приводит к разыменованию NULL-указателя.
Чтобы это исправить, передайте номер ЦП в intel_pstate_update_max_freq() и используйте
all_cpu_data[] для тех процессоров, для которых существует действующая политика cpufreq.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: cpufreq: intel_pstate: Fix crash during turbo disable When the system is booted with kernel command line argument "nosmt" or "maxcpus" to limit the number of CPUs, disabling turbo via: echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo results in a crash: PF: supervisor read access in kernel mode PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP PTI ... RIP: 0010:store_no_turbo+0x100/0x1f0 ... This occurs because for_each_possible_cpu() returns CPUs even if they are not online. For those CPUs, all_cpu_data[] will be NULL. Since commit 973207ae3d7c ("cpufreq: intel_pstate: Rearrange max frequency updates handling code"), all_cpu_data[] is dereferenced even for CPUs which are not online, causing the NULL pointer dereference. To fix that, pass CPU number to intel_pstate_update_max_freq() and use all_cpu_data[] for those CPUs for which there is a valid cpufreq policy.