3535static const struct dma_fence_ops amdgpu_userq_fence_ops ;
3636static struct kmem_cache * amdgpu_userq_fence_slab ;
3737
38+ #define AMDGPU_USERQ_MAX_HANDLES (1U << 16)
39+
3840int amdgpu_userq_fence_slab_init (void )
3941{
4042 amdgpu_userq_fence_slab = kmem_cache_create ("amdgpu_userq_fence" ,
@@ -478,6 +480,11 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
478480 if (!amdgpu_userq_enabled (dev ))
479481 return - ENOTSUPP ;
480482
483+ if (args -> num_syncobj_handles > AMDGPU_USERQ_MAX_HANDLES ||
484+ args -> num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES ||
485+ args -> num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES )
486+ return - EINVAL ;
487+
481488 num_syncobj_handles = args -> num_syncobj_handles ;
482489 syncobj_handles = memdup_user (u64_to_user_ptr (args -> syncobj_handles ),
483490 size_mul (sizeof (u32 ), num_syncobj_handles ));
@@ -664,6 +671,11 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
664671 if (!amdgpu_userq_enabled (dev ))
665672 return - ENOTSUPP ;
666673
674+ if (wait_info -> num_syncobj_handles > AMDGPU_USERQ_MAX_HANDLES ||
675+ wait_info -> num_bo_write_handles > AMDGPU_USERQ_MAX_HANDLES ||
676+ wait_info -> num_bo_read_handles > AMDGPU_USERQ_MAX_HANDLES )
677+ return - EINVAL ;
678+
667679 num_read_bo_handles = wait_info -> num_bo_read_handles ;
668680 bo_handles_read = memdup_user (u64_to_user_ptr (wait_info -> bo_read_handles ),
669681 size_mul (sizeof (u32 ), num_read_bo_handles ));
@@ -833,7 +845,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
833845
834846 dma_resv_for_each_fence (& resv_cursor , gobj_read [i ]-> resv ,
835847 DMA_RESV_USAGE_READ , fence ) {
836- if (WARN_ON_ONCE ( num_fences >= wait_info -> num_fences ) ) {
848+ if (num_fences >= wait_info -> num_fences ) {
837849 r = - EINVAL ;
838850 goto free_fences ;
839851 }
@@ -850,7 +862,7 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
850862
851863 dma_resv_for_each_fence (& resv_cursor , gobj_write [i ]-> resv ,
852864 DMA_RESV_USAGE_WRITE , fence ) {
853- if (WARN_ON_ONCE ( num_fences >= wait_info -> num_fences ) ) {
865+ if (num_fences >= wait_info -> num_fences ) {
854866 r = - EINVAL ;
855867 goto free_fences ;
856868 }
@@ -874,8 +886,9 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
874886 goto free_fences ;
875887
876888 dma_fence_unwrap_for_each (f , & iter , fence ) {
877- if (WARN_ON_ONCE ( num_fences >= wait_info -> num_fences ) ) {
889+ if (num_fences >= wait_info -> num_fences ) {
878890 r = - EINVAL ;
891+ dma_fence_put (fence );
879892 goto free_fences ;
880893 }
881894
@@ -898,8 +911,9 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
898911 if (r )
899912 goto free_fences ;
900913
901- if (WARN_ON_ONCE ( num_fences >= wait_info -> num_fences ) ) {
914+ if (num_fences >= wait_info -> num_fences ) {
902915 r = - EINVAL ;
916+ dma_fence_put (fence );
903917 goto free_fences ;
904918 }
905919
0 commit comments