Skip to content

Commit 8059add

Browse files
evelikov-workevelikov
authored andcommitted
drm: allow render capable master with DRM_AUTH ioctls
There are cases (in mesa and applications) where one would open the primary node without properly authenticating the client. Sometimes we don't check if the authentication succeeds, but there's also cases we simply forget to do it. The former was a case for Mesa where it did not not check the return value of drmGetMagic() [1]. That was fixed recently although, there's the question of older drivers or other apps that exbibit this behaviour. While omitting the call results in issues as seen in [2] and [3]. In the libva case, libva itself doesn't authenticate the DRM client and the vaGetDisplayDRM documentation doesn't mention if the app should either. As of today, the official vainfo utility doesn't authenticate. To workaround issues like these, some users resort to running their apps under sudo. Which admittedly isn't always a good idea. Since any DRIVER_RENDER driver has sufficient isolation between clients, we can use that, for unauthenticated [primary node] ioctls that require DRM_AUTH. But only if the respective ioctl is tagged as DRM_RENDER_ALLOW. v2: - Rework/simplify if check (Daniel V) - Add examples to commit messages, elaborate. (Daniel V) v3: - Use single unlikely (Daniel V) [1] https://gitlab.freedesktop.org/mesa/mesa/blob/2bc1f5c2e70fe3b4d41f060af9859bc2a94c5b62/src/egl/drivers/dri2/platform_wayland.c#L1136 [2] https://lists.freedesktop.org/archives/libva/2016-July/004185.html [3] https://gitlab.freedesktop.org/mesa/kmscube/issues/1 Testcase: igt/core_unauth_vs_render Cc: intel-gfx@lists.freedesktop.org Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20190114085408.15933-2-emil.l.velikov@gmail.com
1 parent f16bb4d commit 8059add

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

drivers/gpu/drm/drm_ioctl.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,13 @@ int drm_version(struct drm_device *dev, void *data,
508508
return err;
509509
}
510510

511+
static inline bool
512+
drm_render_driver_and_ioctl(const struct drm_device *dev, u32 flags)
513+
{
514+
return drm_core_check_feature(dev, DRIVER_RENDER) &&
515+
(flags & DRM_RENDER_ALLOW);
516+
}
517+
511518
/**
512519
* drm_ioctl_permit - Check ioctl permissions against caller
513520
*
@@ -522,14 +529,19 @@ int drm_version(struct drm_device *dev, void *data,
522529
*/
523530
int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
524531
{
532+
const struct drm_device *dev = file_priv->minor->dev;
533+
525534
/* ROOT_ONLY is only for CAP_SYS_ADMIN */
526535
if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
527536
return -EACCES;
528537

529-
/* AUTH is only for authenticated or render client */
530-
if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
531-
!file_priv->authenticated))
532-
return -EACCES;
538+
/* AUTH is only for master ... */
539+
if (unlikely((flags & DRM_AUTH) && drm_is_primary_client(file_priv))) {
540+
/* authenticated ones, or render capable on DRM_RENDER_ALLOW. */
541+
if (!file_priv->authenticated &&
542+
!drm_render_driver_and_ioctl(dev, flags))
543+
return -EACCES;
544+
}
533545

534546
/* MASTER is only for master or control clients */
535547
if (unlikely((flags & DRM_MASTER) &&

0 commit comments

Comments
 (0)