@@ -508,6 +508,13 @@ int drm_version(struct drm_device *dev, void *data,
508
508
return err ;
509
509
}
510
510
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
+
511
518
/**
512
519
* drm_ioctl_permit - Check ioctl permissions against caller
513
520
*
@@ -522,14 +529,19 @@ int drm_version(struct drm_device *dev, void *data,
522
529
*/
523
530
int drm_ioctl_permit (u32 flags , struct drm_file * file_priv )
524
531
{
532
+ const struct drm_device * dev = file_priv -> minor -> dev ;
533
+
525
534
/* ROOT_ONLY is only for CAP_SYS_ADMIN */
526
535
if (unlikely ((flags & DRM_ROOT_ONLY ) && !capable (CAP_SYS_ADMIN )))
527
536
return - EACCES ;
528
537
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
+ }
533
545
534
546
/* MASTER is only for master or control clients */
535
547
if (unlikely ((flags & DRM_MASTER ) &&
@@ -570,7 +582,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
570
582
DRM_IOCTL_DEF (DRM_IOCTL_SET_UNIQUE , drm_invalid_op , DRM_AUTH |DRM_MASTER |DRM_ROOT_ONLY ),
571
583
DRM_IOCTL_DEF (DRM_IOCTL_BLOCK , drm_noop , DRM_AUTH |DRM_MASTER |DRM_ROOT_ONLY ),
572
584
DRM_IOCTL_DEF (DRM_IOCTL_UNBLOCK , drm_noop , DRM_AUTH |DRM_MASTER |DRM_ROOT_ONLY ),
573
- DRM_IOCTL_DEF (DRM_IOCTL_AUTH_MAGIC , drm_authmagic , DRM_AUTH | DRM_UNLOCKED |DRM_MASTER ),
585
+ DRM_IOCTL_DEF (DRM_IOCTL_AUTH_MAGIC , drm_authmagic , DRM_UNLOCKED |DRM_MASTER ),
574
586
575
587
DRM_IOCTL_DEF (DRM_IOCTL_ADD_MAP , drm_legacy_addmap_ioctl , DRM_AUTH |DRM_MASTER |DRM_ROOT_ONLY ),
576
588
DRM_IOCTL_DEF (DRM_IOCTL_RM_MAP , drm_legacy_rmmap_ioctl , DRM_AUTH ),
0 commit comments