• Jani Nikula's avatar
    drm: fix potential dangling else problems in for_each_ macros · 373701b1
    Jani Nikula authored
    
    
    We have serious dangling else bugs waiting to happen in our for_each_
    style macros with ifs. Consider, for example,
    
     #define drm_for_each_plane_mask(plane, dev, plane_mask) \
             list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \
                     if ((plane_mask) & (1 << drm_plane_index(plane)))
    
    If this is used in context:
    
    	if (condition)
    		drm_for_each_plane_mask(plane, dev, plane_mask);
    	else
    		foo();
    
    foo() will be called for each plane *not* in plane_mask, if condition
    holds, and not at all if condition doesn't hold.
    
    Fix this by reversing the conditions in the macros, and adding an else
    branch for the "for each" block, so that other if/else blocks can't
    interfere. Provide a "for_each_if" helper macro to make it easier to get
    this right.
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/1448392916-2281-1-git-send-email-jani.nikula@intel.com
    Signed-off-by: Daniel ...
    373701b1
drm_crtc.h 57.1 KB