Reviewed-by: Lyude Paul <lyude@xxxxxxxxxx> On Tue, 2022-11-01 at 15:07 +0800, Shang XiaoJing wrote: > drm_vblank_init() call drmm_add_action_or_reset() with > drm_vblank_init_release() as action. If __drmm_add_action() failed, will > directly call drm_vblank_init_release() with the vblank whose worker is > NULL. As the resule, a null-ptr-deref will happen in > kthread_destroy_worker(). Add the NULL check before calling > drm_vblank_destroy_worker(). > > BUG: null-ptr-deref > KASAN: null-ptr-deref in range [0x0000000000000068-0x000000000000006f] > CPU: 5 PID: 961 Comm: modprobe Not tainted 6.0.0-11331-gd465bff130bf-dirty > RIP: 0010:kthread_destroy_worker+0x25/0xb0 > Call Trace: > <TASK> > drm_vblank_init_release+0x124/0x220 [drm] > ? drm_crtc_vblank_restore+0x8b0/0x8b0 [drm] > __drmm_add_action_or_reset+0x41/0x50 [drm] > drm_vblank_init+0x282/0x310 [drm] > vkms_init+0x35f/0x1000 [vkms] > ? 0xffffffffc4508000 > ? lock_is_held_type+0xd7/0x130 > ? __kmem_cache_alloc_node+0x1c2/0x2b0 > ? lock_is_held_type+0xd7/0x130 > ? 0xffffffffc4508000 > do_one_initcall+0xd0/0x4f0 > ... > do_syscall_64+0x35/0x80 > entry_SYSCALL_64_after_hwframe+0x46/0xb0 > > Fixes: 5e6c2b4f9161 ("drm/vblank: Add vblank works") > Signed-off-by: Shang XiaoJing <shangxiaojing@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_internal.h | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h > index 7bb98e6a446d..5ea5e260118c 100644 > --- a/drivers/gpu/drm/drm_internal.h > +++ b/drivers/gpu/drm/drm_internal.h > @@ -104,7 +104,8 @@ static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank) > > static inline void drm_vblank_destroy_worker(struct drm_vblank_crtc *vblank) > { > - kthread_destroy_worker(vblank->worker); > + if (vblank->worker) > + kthread_destroy_worker(vblank->worker); > } > > int drm_vblank_worker_init(struct drm_vblank_crtc *vblank); -- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat