[PATCH v2 3/7] drm/amdgpu: Fix the use-after-free issue in wait IOCTL

Christian König ckoenig.leichtzumerken at gmail.com
Fri Dec 13 10:13:58 UTC 2024


Am 12.12.24 um 15:25 schrieb Arunpravin Paneer Selvam:
> The xarray pointer which has the userqueue xarray structure
> reference should be cleared when the userqueue gets
> destroyed. Otherwise, we may access the freed xa memory and
> see the below warnings.
>
> warning 1:
> BUG: KASAN: slab-use-after-free in _raw_spin_lock+0x7a/0xe0
> [  +0.000044] Call Trace:
> [  +0.000017]  <TASK>
> [  +0.000016]  dump_stack_lvl+0x6c/0x90
> [  +0.000025]  print_report+0xc4/0x5e0
> [  +0.000025]  ? srso_return_thunk+0x5/0x5f
> [  +0.000024]  ? kasan_complete_mode_report_info+0x60/0x1d0
> [  +0.000030]  ? _raw_spin_lock+0x7a/0xe0
> [  +0.000023]  kasan_report+0xdf/0x120
> [  +0.000023]  ? _raw_spin_lock+0x7a/0xe0
> [  +0.000025]  kasan_check_range+0xf7/0x1b0
> [  +0.000025]  __kasan_check_write+0x14/0x20
> [  +0.000024]  _raw_spin_lock+0x7a/0xe0
> [  +0.000023]  ? __pfx__raw_spin_lock+0x10/0x10
> [  +0.000024]  ? amdgpu_userq_wait_ioctl+0xac0/0x1f30 [amdgpu]
> [  +0.000442]  amdgpu_userq_wait_ioctl+0x18fc/0x1f30 [amdgpu]
> [  +0.000428]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000424]  ? __pfx_idr_alloc_u32+0x10/0x10
> [  +0.000027]  ? srso_return_thunk+0x5/0x5f
> [  +0.000024]  ? __kasan_check_write+0x14/0x20
> [  +0.000025]  ? srso_return_thunk+0x5/0x5f
> [  +0.000024]  ? idr_alloc+0x72/0xc0
> [  +0.000023]  ? srso_return_thunk+0x5/0x5f
> [  +0.000023]  ? fput+0x1c/0x2f0
> [  +0.000025]  drm_ioctl_kernel+0x178/0x2f0 [drm]
> [  +0.000065]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000425]  ? __pfx_drm_ioctl_kernel+0x10/0x10 [drm]
> [  +0.000064]  ? srso_return_thunk+0x5/0x5f
> [  +0.000023]  ? __kasan_check_write+0x14/0x20
> [  +0.000025]  drm_ioctl+0x513/0xd20 [drm]
> [  +0.000058]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  +0.000428]  ? __pfx_drm_ioctl+0x10/0x10 [drm]
> [  +0.000061]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> [  +0.000027]  ? __count_memcg_events+0x11f/0x3a0
> [  +0.000027]  ? srso_return_thunk+0x5/0x5f
> [  +0.001040]  ? srso_return_thunk+0x5/0x5f
> [  +0.000969]  ? _raw_spin_unlock_irqrestore+0x27/0x50
> [  +0.000966]  amdgpu_drm_ioctl+0xcd/0x1d0 [amdgpu]
> [  +0.001352]  __x64_sys_ioctl+0x135/0x1b0
> [  +0.000966]  x64_sys_call+0x1205/0x20d0
> [  +0.000968]  do_syscall_64+0x4d/0x120
> [  +0.000960]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> [  +0.000962] RIP: 0033:0x7f42af11a94f
>
> warning 2:
> WARNING: at lib/xarray.c:1849 __xa_alloc+0x13a/0x150
> [  366.491409] RIP: 0010:__xa_alloc+0x13a/0x150
> [  366.491434] Call Trace:
> [  366.491437]  <TASK>
> [  366.491440]  ? show_regs+0x6d/0x80
> [  366.491445]  ? __warn+0x91/0x140
> [  366.491450]  ? __xa_alloc+0x13a/0x150
> [  366.491453]  ? report_bug+0x1c9/0x1e0
> [  366.491459]  ? handle_bug+0x63/0xa0
> [  366.491463]  ? exc_invalid_op+0x1d/0x80
> [  366.491467]  ? asm_exc_invalid_op+0x1f/0x30
> [  366.491476]  ? __xa_alloc+0x13a/0x150
> [  366.491484]  amdgpu_userq_wait_ioctl+0xe0e/0xfe0 [amdgpu]
> [  366.491743]  ? idr_alloc_u32+0x97/0xd0
> [  366.491749]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  366.491912]  drm_ioctl_kernel+0xae/0x100 [drm]
> [  366.491942]  drm_ioctl+0x2a1/0x500 [drm]
> [  366.491961]  ? __pfx_amdgpu_userq_wait_ioctl+0x10/0x10 [amdgpu]
> [  366.492127]  ? srso_return_thunk+0x5/0x5f
> [  366.492132]  ? srso_return_thunk+0x5/0x5f
> [  366.492135]  ? _raw_spin_unlock_irqrestore+0x2b/0x50
> [  366.492139]  amdgpu_drm_ioctl+0x4f/0x90 [amdgpu]
> [  366.492288]  __x64_sys_ioctl+0x99/0xd0
> [  366.492295]  x64_sys_call+0x1209/0x20d0
> [  366.492299]  do_syscall_64+0x51/0x120
> [  366.492303]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> [  366.492418] RIP: 0033:0x7f86f3b1a94f
>
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam at amd.com>

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c | 1 +
>   1 file changed, 1 insertion(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> index cba51bdf2e2c..311d536a7079 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> @@ -73,6 +73,7 @@ amdgpu_userqueue_cleanup(struct amdgpu_userq_mgr *uq_mgr,
>   	}
>   
>   	uq_funcs->mqd_destroy(uq_mgr, queue);
> +	queue->fence_drv->fence_drv_xa_ptr = NULL;
>   	amdgpu_userq_fence_driver_free(queue);
>   	idr_remove(&uq_mgr->userq_idr, queue_id);
>   	kfree(queue);



More information about the amd-gfx mailing list