Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu/pm: Fix potential Spectre v1

idx can be indirectly controlled by user-space, hence leading to a
potential exploitation of the Spectre variant 1 vulnerability.

This issue was detected with the help of Smatch:

drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c:408 amdgpu_set_pp_force_state()
warn: potential spectre issue 'data.states'

Fix this by sanitizing idx before using it to index data.states

Notice that given that speculation windows are large, the policy is
to kill the speculation on the first load and not worry if it can be
completed with a dependent load/store [1].

[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2

Cc: stable@vger.kernel.org
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Gustavo A. R. Silva and committed by
Alex Deucher
ddf74e79 7ac7aebe

+2 -1
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 31 31 #include <linux/power_supply.h> 32 32 #include <linux/hwmon.h> 33 33 #include <linux/hwmon-sysfs.h> 34 - 34 + #include <linux/nospec.h> 35 35 36 36 static int amdgpu_debugfs_pm_init(struct amdgpu_device *adev); 37 37 ··· 403 403 count = -EINVAL; 404 404 goto fail; 405 405 } 406 + idx = array_index_nospec(idx, ARRAY_SIZE(data.states)); 406 407 407 408 amdgpu_dpm_get_pp_num_states(adev, &data); 408 409 state = data.states[idx];