Skip to content

Commit 4b057e7

Browse files
committed
Merge tag 'drm-misc-fixes-2019-02-22' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-fixes for v5.0: - Block fb changes for async atomic updates to prevent a use after free. - Fix ID mismatch error on load in bochs. - Fix memory leak when drm_setup fails. - Fixes around handling of DRM_AUTH. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/42113611-e2cd-6bdd-7de5-4f8ab5a0cbe6@linux.intel.com
2 parents 634092b + 04b9c48 commit 4b057e7

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

drivers/gpu/drm/drm_file.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,18 @@ void drm_file_free(struct drm_file *file)
262262
kfree(file);
263263
}
264264

265+
static void drm_close_helper(struct file *filp)
266+
{
267+
struct drm_file *file_priv = filp->private_data;
268+
struct drm_device *dev = file_priv->minor->dev;
269+
270+
mutex_lock(&dev->filelist_mutex);
271+
list_del(&file_priv->lhead);
272+
mutex_unlock(&dev->filelist_mutex);
273+
274+
drm_file_free(file_priv);
275+
}
276+
265277
static int drm_setup(struct drm_device * dev)
266278
{
267279
int ret;
@@ -318,8 +330,10 @@ int drm_open(struct inode *inode, struct file *filp)
318330
goto err_undo;
319331
if (need_setup) {
320332
retcode = drm_setup(dev);
321-
if (retcode)
333+
if (retcode) {
334+
drm_close_helper(filp);
322335
goto err_undo;
336+
}
323337
}
324338
return 0;
325339

@@ -473,11 +487,7 @@ int drm_release(struct inode *inode, struct file *filp)
473487

474488
DRM_DEBUG("open_count = %d\n", dev->open_count);
475489

476-
mutex_lock(&dev->filelist_mutex);
477-
list_del(&file_priv->lhead);
478-
mutex_unlock(&dev->filelist_mutex);
479-
480-
drm_file_free(file_priv);
490+
drm_close_helper(filp);
481491

482492
if (!--dev->open_count) {
483493
drm_lastclose(dev);

drivers/gpu/drm/drm_ioctl.c

Lines changed: 17 additions & 5 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) &&
@@ -570,7 +582,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
570582
DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
571583
DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
572584
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),
574586

575587
DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
576588
DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH),

include/drm/drm_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ static inline bool drm_dev_is_unplugged(struct drm_device *dev)
767767
*
768768
* Returns true if the @feature is supported, false otherwise.
769769
*/
770-
static inline bool drm_core_check_feature(struct drm_device *dev, u32 feature)
770+
static inline bool drm_core_check_feature(const struct drm_device *dev, u32 feature)
771771
{
772772
return dev->driver->driver_features & dev->driver_features & feature;
773773
}

0 commit comments

Comments
 (0)