Skip to content

Commit 2e63972

Browse files
lituo1996daeinki
authored andcommitted
drm/exynos: fix a possible null-pointer dereference due to data race in exynos_drm_crtc_atomic_disable()
The variable crtc->state->event is often protected by the lock crtc->dev->event_lock when is accessed. However, it is accessed as a condition of an if statement in exynos_drm_crtc_atomic_disable() without holding the lock: if (crtc->state->event && !crtc->state->active) However, if crtc->state->event is changed to NULL by another thread right after the conditions of the if statement is checked to be true, a null-pointer dereference can occur in drm_crtc_send_vblank_event(): e->pipe = pipe; To fix this possible null-pointer dereference caused by data race, the spin lock coverage is extended to protect the if statement as well as the function call to drm_crtc_send_vblank_event(). Reported-by: BassCheck <bass@buaa.edu.cn> Link: https://sites.google.com/view/basscheck/home Signed-off-by: Tuo Li <islituo@gmail.com> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Added relevant link. Signed-off-by: Inki Dae <inki.dae@samsung.com>
1 parent d9aa1da commit 2e63972

1 file changed

Lines changed: 2 additions & 3 deletions

File tree

drivers/gpu/drm/exynos/exynos_drm_crtc.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,12 @@ static void exynos_drm_crtc_atomic_disable(struct drm_crtc *crtc,
3939
if (exynos_crtc->ops->atomic_disable)
4040
exynos_crtc->ops->atomic_disable(exynos_crtc);
4141

42+
spin_lock_irq(&crtc->dev->event_lock);
4243
if (crtc->state->event && !crtc->state->active) {
43-
spin_lock_irq(&crtc->dev->event_lock);
4444
drm_crtc_send_vblank_event(crtc, crtc->state->event);
45-
spin_unlock_irq(&crtc->dev->event_lock);
46-
4745
crtc->state->event = NULL;
4846
}
47+
spin_unlock_irq(&crtc->dev->event_lock);
4948
}
5049

5150
static int exynos_crtc_atomic_check(struct drm_crtc *crtc,

0 commit comments

Comments
 (0)