drm/amd/display: perform a bounds check before filling dirty rectangles
authorjsg <jsg@openbsd.org>
Fri, 4 Aug 2023 09:22:11 +0000 (09:22 +0000)
committerjsg <jsg@openbsd.org>
Fri, 4 Aug 2023 09:22:11 +0000 (09:22 +0000)
From Hamza Mahfooz
d58fb94f24f89c833bd73d370b27b58867d78120 in linux-6.1.y/6.1.43
af22d6a869cc26b519bfdcd54293c53f2e491870 in mainline linux

sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 3347153..328111f 100644 (file)
@@ -4955,11 +4955,7 @@ static inline void fill_dc_dirty_rect(struct drm_plane *plane,
                                      int32_t y, int32_t width, int32_t height,
                                      int *i, bool ffu)
 {
-       if (*i > DC_MAX_DIRTY_RECTS)
-               return;
-
-       if (*i == DC_MAX_DIRTY_RECTS)
-               goto out;
+       WARN_ON(*i >= DC_MAX_DIRTY_RECTS);
 
        dirty_rect->x = x;
        dirty_rect->y = y;
@@ -4975,7 +4971,6 @@ static inline void fill_dc_dirty_rect(struct drm_plane *plane,
                        "[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)",
                        plane->base.id, x, y, width, height);
 
-out:
        (*i)++;
 }
 
@@ -5057,6 +5052,9 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,
                new_plane_state->plane->base.id,
                bb_changed, fb_changed, num_clips);
 
+       if ((num_clips + (bb_changed ? 2 : 0)) > DC_MAX_DIRTY_RECTS)
+               goto ffu;
+
        if (bb_changed) {
                fill_dc_dirty_rect(new_plane_state->plane, &dirty_rects[i],
                                   new_plane_state->crtc_x,
@@ -5086,9 +5084,6 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,
                                   new_plane_state->crtc_h, &i, false);
        }
 
-       if (i > DC_MAX_DIRTY_RECTS)
-               goto ffu;
-
        flip_addrs->dirty_rect_count = i;
        return;