drm/atomic-helpers: Properly avoid full modeset dance

Daniel Vetter daniel at ffwll.ch
Fri Mar 27 08:10:23 PDT 2015


On Fri, Mar 27, 2015 at 05:33:00PM +0300, Dan Carpenter wrote:
> Hello Daniel Vetter,
> 
> This is a semi-automatic email about new static checker warnings.
> 
> The patch 76b58b03806b: "drm/atomic-helpers: Properly avoid full 
> modeset dance" from Mar 26, 2015, leads to the following Smatch 
> complaint:
> 
> drivers/gpu/drm/drm_atomic_helper.c:615 disable_outputs()
> 	 warn: variable dereferenced before check 'connector->state->crtc' (see line 591)
> 
> drivers/gpu/drm/drm_atomic_helper.c
>    590			if (!old_crtc_state->active ||
>    591			    !needs_modeset(connector->state->crtc->state))
>                                            ^^^^^^^^^^^^^^^^^^^^^^
> Patch introduces a new dereference.
> 
>    592				continue;
>    593	
>    594			encoder = old_conn_state->best_encoder;
>    595	
>    596			/* We shouldn't get this far if we didn't previously have
>    597			 * an encoder.. but WARN_ON() rather than explode.
>    598			 */
>    599			if (WARN_ON(!encoder))
>    600				continue;
>    601	
>    602			funcs = encoder->helper_private;
>    603	
>    604			DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
>    605					 encoder->base.id, encoder->name);
>    606	
>    607			/*
>    608			 * Each encoder has at most one connector (since we always steal
>    609			 * it away), so we won't call disable hooks twice.
>    610			 */
>    611			if (encoder->bridge)
>    612				encoder->bridge->funcs->disable(encoder->bridge);
>    613	
>    614			/* Right function depends upon target state. */
>    615			if (connector->state->crtc && funcs->prepare)
>                             ^^^^^^^^^^^^^^^^^^^^^^
> Existing code checks for NULL.
> 
>    616				funcs->prepare(encoder);
>    617			else if (funcs->disable)

Thierry was a notch faster with reporting this on irc, already fixed.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list