drm/lease: Make sure implicit planes are leased
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 28 Feb 2019 14:49:08 +0000 (15:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 9 Jun 2019 07:17:23 +0000 (09:17 +0200)
commit 204f640da6914844b3270b41b29c84f6e3b74083 upstream.

If userspace doesn't enable universal planes, then we automatically
add the primary and cursor planes. But for universal userspace there's
no such check (and maybe we only want to give the lessee one plane,
maybe not even the primary one), hence we need to check for the
implied plane.

v2: don't forget setcrtc ioctl.

v3: Still allow disabling of the crtc in SETCRTC.

Cc: stable@vger.kernel.org
Cc: Keith Packard <keithp@keithp.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190228144910.26488-6-daniel.vetter@ffwll.ch
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_plane.c

index 9cbe8f5c9acafedf5bee808e82b205984528f1b8..6e241a3c31ee3abd1c4609ab376d7c8cde34beb2 100644 (file)
@@ -595,6 +595,10 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
 
        plane = crtc->primary;
 
+       /* allow disabling with the primary plane leased */
+       if (crtc_req->mode_valid && !drm_lease_held(file_priv, plane->base.id))
+               return -EACCES;
+
        mutex_lock(&crtc->dev->mode_config.mutex);
        drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
 retry:
index d36b1be632d963a59775bce079d70c8c735b3b61..2411b6de055e222c34c0243dc77e319e95c8ab6a 100644 (file)
@@ -940,6 +940,11 @@ retry:
                if (ret)
                        goto out;
 
+               if (!drm_lease_held(file_priv, crtc->cursor->base.id)) {
+                       ret = -EACCES;
+                       goto out;
+               }
+
                ret = drm_mode_cursor_universal(crtc, req, file_priv, &ctx);
                goto out;
        }
@@ -1042,6 +1047,9 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
 
        plane = crtc->primary;
 
+       if (!drm_lease_held(file_priv, plane->base.id))
+               return -EACCES;
+
        if (crtc->funcs->page_flip_target) {
                u32 current_vblank;
                int r;