lkml.org 
[lkml]   [2020]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.5 139/399] gpu/drm: ingenic: Avoid null pointer deference in plane atomic update
    Date
    From: Paul Cercueil <paul@crapouillou.net>

    [ Upstream commit 354b051c5dcbeb35bbfd5d54161364fc7a75a58a ]

    It is possible that there is no drm_framebuffer associated with a given
    plane state.

    v2: Handle drm_plane->state which can be NULL too

    Signed-off-by: Paul Cercueil <paul@crapouillou.net>
    Link: https://patchwork.freedesktop.org/patch/msgid/20191210144142.33143-2-paul@crapouillou.net
    # *** extracted tags ***
    Acked-by: Sam Ravnborg <sam@ravnborg.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/ingenic/ingenic-drm.c | 16 ++++++++++------
    1 file changed, 10 insertions(+), 6 deletions(-)

    diff --git a/drivers/gpu/drm/ingenic/ingenic-drm.c b/drivers/gpu/drm/ingenic/ingenic-drm.c
    index ec32e1c673350..43a015f33e975 100644
    --- a/drivers/gpu/drm/ingenic/ingenic-drm.c
    +++ b/drivers/gpu/drm/ingenic/ingenic-drm.c
    @@ -372,14 +372,18 @@ static void ingenic_drm_plane_atomic_update(struct drm_plane *plane,
    struct ingenic_drm *priv = drm_plane_get_priv(plane);
    struct drm_plane_state *state = plane->state;
    unsigned int width, height, cpp;
    + dma_addr_t addr;

    - width = state->crtc->state->adjusted_mode.hdisplay;
    - height = state->crtc->state->adjusted_mode.vdisplay;
    - cpp = state->fb->format->cpp[plane->index];
    + if (state && state->fb) {
    + addr = drm_fb_cma_get_gem_addr(state->fb, state, 0);
    + width = state->crtc->state->adjusted_mode.hdisplay;
    + height = state->crtc->state->adjusted_mode.vdisplay;
    + cpp = state->fb->format->cpp[plane->index];

    - priv->dma_hwdesc->addr = drm_fb_cma_get_gem_addr(state->fb, state, 0);
    - priv->dma_hwdesc->cmd = width * height * cpp / 4;
    - priv->dma_hwdesc->cmd |= JZ_LCD_CMD_EOF_IRQ;
    + priv->dma_hwdesc->addr = addr;
    + priv->dma_hwdesc->cmd = width * height * cpp / 4;
    + priv->dma_hwdesc->cmd |= JZ_LCD_CMD_EOF_IRQ;
    + }
    }

    static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-21 08:50    [W:4.331 / U:1.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site