In scl_cal_scale*(), if the dst parameter equals 1, then division by 0
will happen. We'll have to add a check for the destination rectangle's
width/height being < 2 in vop_plane_atomic_check(), just like the VOP2
driver has to check for the width/height being < 4...

Found by Linux Verification Center (linuxtesting.org) with the Svace static
analysis tool.

Fixes: 4c156c21c794 ("drm/rockchip: vop: support plane scale")
Signed-off-by: Sergey Shtylyov <[email protected]>
Cc: [email protected]

---
The patch is against the drm-misc-fixes branch of the DRM kernel.git repo
on gitlab.freedesktop.org.  It replaces [1] for which I've got no neither
feedback nor testing...

[1] https://lore.kernel.org/all/[email protected]/

 drivers/gpu/drm/rockchip/rockchip_drm_vop.c |   11 +++++++++++
 1 file changed, 11 insertions(+)

Index: kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
===================================================================
--- kernel.orig/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -817,6 +817,7 @@ static int vop_plane_atomic_check(struct
        struct drm_framebuffer *fb = new_plane_state->fb;
        struct vop_win *vop_win = to_vop_win(plane);
        const struct vop_win_data *win = vop_win->data;
+       struct drm_rect *dest = &new_plane_state->dst;
        int ret;
        int min_scale = win->phy->scl ? FRAC_16_16(1, 8) :
                                        DRM_PLANE_NO_SCALING;
@@ -844,6 +845,16 @@ static int vop_plane_atomic_check(struct
        if (ret < 0)
                return ret;
 
+       if (win->phy->scl) {
+               /* Disallow width/height < 2 to avoid division by 0. */
+               if (drm_rect_width(dest) < 2 || drm_rect_height(dest) < 2) {
+                       DRM_DEBUG_KMS("Invalid dest size: %dx%d, min size is 
2x2\n",
+                                     drm_rect_width(dest), 
drm_rect_height(dest));
+                       new_plane_state->visible = false;
+                       return 0;
+               }
+       }
+
        /*
         * Src.x1 can be odd when do clip, but yuv plane start point
         * need align with 2 pixel.

Reply via email to