Skip to content

Commit 7d1de85

Browse files
thierryredingdanvet
authored andcommitted
drm/irq: Check for valid VBLANK before dereference
When accessing the array of per-CRTC VBLANK structures we must always check that the index into the array is valid before dereferencing to avoid crashing. Signed-off-by: Thierry Reding <[email protected]> [danvet: Squash in my own whitespace ocd fixup in drm_vblank_count.] Signed-off-by: Daniel Vetter <[email protected]>
1 parent 2a7d3d6 commit 7d1de85

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

drivers/gpu/drm/drm_irq.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ u32 drm_vblank_count(struct drm_device *dev, int crtc)
877877

878878
if (WARN_ON(crtc >= dev->num_crtcs))
879879
return 0;
880+
880881
return vblank->count;
881882
}
882883
EXPORT_SYMBOL(drm_vblank_count);
@@ -1110,10 +1111,10 @@ void drm_vblank_put(struct drm_device *dev, int crtc)
11101111
{
11111112
struct drm_vblank_crtc *vblank = &dev->vblank[crtc];
11121113

1113-
if (WARN_ON(atomic_read(&vblank->refcount) == 0))
1114+
if (WARN_ON(crtc >= dev->num_crtcs))
11141115
return;
11151116

1116-
if (WARN_ON(crtc >= dev->num_crtcs))
1117+
if (WARN_ON(atomic_read(&vblank->refcount) == 0))
11171118
return;
11181119

11191120
/* Last user schedules interrupt disable */
@@ -1158,6 +1159,9 @@ void drm_wait_one_vblank(struct drm_device *dev, int crtc)
11581159
int ret;
11591160
u32 last;
11601161

1162+
if (WARN_ON(crtc >= dev->num_crtcs))
1163+
return;
1164+
11611165
ret = drm_vblank_get(dev, crtc);
11621166
if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", crtc, ret))
11631167
return;
@@ -1428,6 +1432,9 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
14281432
if (!dev->num_crtcs)
14291433
return;
14301434

1435+
if (WARN_ON(crtc >= dev->num_crtcs))
1436+
return;
1437+
14311438
if (vblank->inmodeset) {
14321439
spin_lock_irqsave(&dev->vbl_lock, irqflags);
14331440
dev->vblank_disable_allowed = true;

0 commit comments

Comments
 (0)