drm/core: Fix old_fb handling in drm_mode_atomic_ioctl.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 11 Nov 2015 10:29:08 +0000 (11:29 +0100)
committerJani Nikula <jani.nikula@intel.com>
Tue, 17 Nov 2015 11:02:13 +0000 (13:02 +0200)
plane_mask should be cleared inside the retry loop, because it gets
reset on every retry. Without this fix the plane->fb refcounting might
get out of sync on retries, resulting in either leaked memory or
use-after-free.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: stable@vger.kernel.org #v4.3
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1447237751-9663-3-git-send-email-maarten.lankhorst@ubuntu.com
drivers/gpu/drm/drm_atomic.c

index 7bb3845d997492d5aa60092e7441f445d74e6104..0ac31b1ecb676790875705430a14aa1787cc7b05 100644 (file)
@@ -1446,7 +1446,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
        struct drm_plane *plane;
        struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
-       unsigned plane_mask = 0;
+       unsigned plane_mask;
        int ret = 0;
        unsigned int i, j;
 
@@ -1486,6 +1486,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
        state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET);
 
 retry:
+       plane_mask = 0;
        copied_objs = 0;
        copied_props = 0;