diff options
| author | Gustavo A. R. Silva <gustavo@embeddedor.com> | 2018-08-02 22:40:19 -0500 | 
|---|---|---|
| committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2018-08-14 15:26:49 +0800 | 
| commit | de5372da605d3bca46e3102bab51b7e1c0e0a6f6 (patch) | |
| tree | 8d187c054a300041da5f450f4c37dbfe4fcde471 /drivers/gpu | |
| parent | 8d458ea0ec331adb4c829289e9a56c97d3c1e542 (diff) | |
| download | linux-de5372da605d3bca46e3102bab51b7e1c0e0a6f6.tar.bz2 | |
drm/i915/kvmgt: Fix potential Spectre v1
info.index 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/i915/gvt/kvmgt.c:1232 intel_vgpu_ioctl() warn:
potential spectre issue 'vgpu->vdev.region' [r]
Fix this by sanitizing info.index before indirectly using it to index
vgpu->vdev.region
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: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/kvmgt.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index 31986c1c253e..9ba70826737a 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -43,6 +43,8 @@  #include <linux/mdev.h>  #include <linux/debugfs.h> +#include <linux/nospec.h> +  #include "i915_drv.h"  #include "gvt.h" @@ -1139,7 +1141,8 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,  	} else if (cmd == VFIO_DEVICE_GET_REGION_INFO) {  		struct vfio_region_info info;  		struct vfio_info_cap caps = { .buf = NULL, .size = 0 }; -		int i, ret; +		unsigned int i; +		int ret;  		struct vfio_region_info_cap_sparse_mmap *sparse = NULL;  		size_t size;  		int nr_areas = 1; @@ -1224,6 +1227,10 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,  				if (info.index >= VFIO_PCI_NUM_REGIONS +  						vgpu->vdev.num_regions)  					return -EINVAL; +				info.index = +					array_index_nospec(info.index, +							VFIO_PCI_NUM_REGIONS + +							vgpu->vdev.num_regions);  				i = info.index - VFIO_PCI_NUM_REGIONS;  |