Skip to content

Commit 168c02e

Browse files
danvetairlied
authored andcommitted
drm: Fix race when checking for fb in the generic kms obj lookup
In my review of commit 98f75de Author: Rob Clark <robdclark@gmail.com> Date: Fri May 30 11:37:03 2014 -0400 drm: add object property typ I asked for a check to make sure that we never leak an fb from the generic mode object lookup since those have completely different lifetime rules. Rob added it, but outside of the idr mutex, which means that our dereference of obj->type can already chase free'd memory. Somehow I didn't spot this, so fix this asap. v2: Simplify the conditionals as suggested by Chris. Cc: Rob Clark <robdclark@gmail.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent dff01de commit 168c02e

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

drivers/gpu/drm/drm_crtc.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,12 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
446446

447447
mutex_lock(&dev->mode_config.idr_mutex);
448448
obj = idr_find(&dev->mode_config.crtc_idr, id);
449-
if (!obj || (type != DRM_MODE_OBJECT_ANY && obj->type != type) ||
450-
(obj->id != id))
449+
if (obj && type != DRM_MODE_OBJECT_ANY && obj->type != type)
450+
obj = NULL;
451+
if (obj && obj->id != id)
452+
obj = NULL;
453+
/* don't leak out unref'd fb's */
454+
if (obj && (obj->type == DRM_MODE_OBJECT_FB))
451455
obj = NULL;
452456
mutex_unlock(&dev->mode_config.idr_mutex);
453457

@@ -474,9 +478,6 @@ struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
474478
* function.*/
475479
WARN_ON(type == DRM_MODE_OBJECT_FB);
476480
obj = _object_find(dev, id, type);
477-
/* don't leak out unref'd fb's */
478-
if (obj && (obj->type == DRM_MODE_OBJECT_FB))
479-
obj = NULL;
480481
return obj;
481482
}
482483
EXPORT_SYMBOL(drm_mode_object_find);

0 commit comments

Comments
 (0)