|
@@ -199,9 +199,14 @@ static const struct drm_ioctl_desc vmw_ioctls[] = {
|
|
|
VMW_IOCTL_DEF(VMW_PRESENT_READBACK,
|
|
|
vmw_present_readback_ioctl,
|
|
|
DRM_MASTER | DRM_AUTH),
|
|
|
+ /*
|
|
|
+ * The permissions of the below ioctl are overridden in
|
|
|
+ * vmw_generic_ioctl(). We require either
|
|
|
+ * DRM_MASTER or capable(CAP_SYS_ADMIN).
|
|
|
+ */
|
|
|
VMW_IOCTL_DEF(VMW_UPDATE_LAYOUT,
|
|
|
vmw_kms_update_layout_ioctl,
|
|
|
- DRM_MASTER | DRM_CONTROL_ALLOW),
|
|
|
+ DRM_RENDER_ALLOW),
|
|
|
VMW_IOCTL_DEF(VMW_CREATE_SHADER,
|
|
|
vmw_shader_define_ioctl,
|
|
|
DRM_AUTH | DRM_RENDER_ALLOW),
|
|
@@ -1123,6 +1128,10 @@ static long vmw_generic_ioctl(struct file *filp, unsigned int cmd,
|
|
|
|
|
|
return (long) vmw_execbuf_ioctl(dev, arg, file_priv,
|
|
|
_IOC_SIZE(cmd));
|
|
|
+ } else if (nr == DRM_COMMAND_BASE + DRM_VMW_UPDATE_LAYOUT) {
|
|
|
+ if (!drm_is_current_master(file_priv) &&
|
|
|
+ !capable(CAP_SYS_ADMIN))
|
|
|
+ return -EACCES;
|
|
|
}
|
|
|
|
|
|
if (unlikely(ioctl->cmd != cmd))
|