3131#include <linux/pci.h>
3232#include <linux/dma-buf.h>
3333#include <linux/dma-fence-unwrap.h>
34+ #include <linux/uaccess.h>
3435
3536#include <drm/amdgpu_drm.h>
3637#include <drm/drm_drv.h>
@@ -508,6 +509,9 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
508509 if (offset_in_page (args -> addr | args -> size ))
509510 return - EINVAL ;
510511
512+ if (!access_ok ((void __user * )(uintptr_t )args -> addr , args -> size ))
513+ return - EFAULT ;
514+
511515 /* reject unknown flag values */
512516 if (args -> flags & ~(AMDGPU_GEM_USERPTR_READONLY |
513517 AMDGPU_GEM_USERPTR_ANONONLY | AMDGPU_GEM_USERPTR_VALIDATE |
@@ -821,7 +825,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
821825 struct drm_syncobj * timeline_syncobj = NULL ;
822826 struct dma_fence_chain * timeline_chain = NULL ;
823827 struct drm_exec exec ;
824- uint64_t vm_size ;
828+ uint64_t vm_size , tmp ;
825829 int r = 0 ;
826830
827831 /* Validate virtual address range against reserved regions. */
@@ -845,7 +849,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
845849
846850 vm_size = adev -> vm_manager .max_pfn * AMDGPU_GPU_PAGE_SIZE ;
847851 vm_size -= AMDGPU_VA_RESERVED_TOP ;
848- if (args -> va_address + args -> map_size > vm_size ) {
852+ if (check_add_overflow ( args -> va_address , args -> map_size , & tmp ) || tmp > vm_size ) {
849853 dev_dbg (dev -> dev ,
850854 "va_address 0x%llx is in top reserved area 0x%llx\n" ,
851855 args -> va_address + args -> map_size , vm_size );
0 commit comments