Re: [bug report] drm: bridge: cdns-mhdp8546: Fix possible null pointer dereference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 11.04.2024 16:39, Dan Carpenter wrote:
Hello Aleksandr Mishin,

Commit 935a92a1c400 ("drm: bridge: cdns-mhdp8546: Fix possible null
pointer dereference") from Apr 8, 2024 (linux-next), leads to the
following Smatch static checker warning:

	drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c:2074 cdns_mhdp_atomic_enable()
	warn: inconsistent returns '&mhdp->link_mutex'.

drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
     1986 static void cdns_mhdp_atomic_enable(struct drm_bridge *bridge,
     1987                                     struct drm_bridge_state *bridge_state)
     1988 {
     1989         struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge);
     1990         struct drm_atomic_state *state = bridge_state->base.state;
     1991         struct cdns_mhdp_bridge_state *mhdp_state;
     1992         struct drm_crtc_state *crtc_state;
     1993         struct drm_connector *connector;
     1994         struct drm_connector_state *conn_state;
     1995         struct drm_bridge_state *new_state;
     1996         const struct drm_display_mode *mode;
     1997         u32 resp;
     1998         int ret;
     1999
     2000         dev_dbg(mhdp->dev, "bridge enable\n");
     2001
     2002         mutex_lock(&mhdp->link_mutex);
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Holding a lock

     2003
     2004         if (mhdp->plugged && !mhdp->link_up) {
     2005                 ret = cdns_mhdp_link_up(mhdp);
     2006                 if (ret < 0)
     2007                         goto out;
     2008         }
     2009
     2010         if (mhdp->info && mhdp->info->ops && mhdp->info->ops->enable)
     2011                 mhdp->info->ops->enable(mhdp);
     2012
     2013         /* Enable VIF clock for stream 0 */
     2014         ret = cdns_mhdp_reg_read(mhdp, CDNS_DPTX_CAR, &resp);
     2015         if (ret < 0) {
     2016                 dev_err(mhdp->dev, "Failed to read CDNS_DPTX_CAR %d\n", ret);
     2017                 goto out;
     2018         }
     2019
     2020         cdns_mhdp_reg_write(mhdp, CDNS_DPTX_CAR,
     2021                             resp | CDNS_VIF_CLK_EN | CDNS_VIF_CLK_RSTN);
     2022
     2023         connector = drm_atomic_get_new_connector_for_encoder(state,
     2024                                                              bridge->encoder);
     2025         if (WARN_ON(!connector))
     2026                 goto out;
     2027
     2028         conn_state = drm_atomic_get_new_connector_state(state, connector);
     2029         if (WARN_ON(!conn_state))
     2030                 goto out;
     2031
     2032         if (mhdp->hdcp_supported &&
     2033             mhdp->hw_state == MHDP_HW_READY &&
     2034             conn_state->content_protection ==
     2035             DRM_MODE_CONTENT_PROTECTION_DESIRED) {
     2036                 mutex_unlock(&mhdp->link_mutex);
     2037                 cdns_mhdp_hdcp_enable(mhdp, conn_state->hdcp_content_type);
     2038                 mutex_lock(&mhdp->link_mutex);
     2039         }
     2040
     2041         crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
     2042         if (WARN_ON(!crtc_state))
     2043                 goto out;
     2044
     2045         mode = &crtc_state->adjusted_mode;
     2046
     2047         new_state = drm_atomic_get_new_bridge_state(state, bridge);
     2048         if (WARN_ON(!new_state))
     2049                 goto out;
     2050
     2051         if (!cdns_mhdp_bandwidth_ok(mhdp, mode, mhdp->link.num_lanes,
     2052                                     mhdp->link.rate)) {
     2053                 ret = -EINVAL;
     2054                 goto out;
     2055         }
     2056
     2057         cdns_mhdp_sst_enable(mhdp, mode);
     2058
     2059         mhdp_state = to_cdns_mhdp_bridge_state(new_state);
     2060
     2061         mhdp_state->current_mode = drm_mode_duplicate(bridge->dev, mode);
     2062         if (!mhdp_state->current_mode)
     2063                 return;
                          ^^^^^^^
Needs to unlock before returning.

Yes. Sorry. It's my mistake.
I'll replace 'return' with 'ret=-EINVAL; goto out;' and offer v2 patch.


     2064
     2065         drm_mode_set_name(mhdp_state->current_mode);
     2066
     2067         dev_dbg(mhdp->dev, "%s: Enabling mode %s\n", __func__, mode->name);
     2068
     2069         mhdp->bridge_enabled = true;
     2070
     2071 out:
     2072         mutex_unlock(&mhdp->link_mutex);
     2073         if (ret < 0)
--> 2074                 schedule_work(&mhdp->modeset_retry_work);
     2075 }

regards,
dan carpenter

--
Kind regards
Aleksandr



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux