[Intel-gfx] [PATCH] drm: Fix race when checking for fb in the generic kms obj lookup
Chris Wilson
chris at chris-wilson.co.uk
Thu Jul 24 10:08:29 CEST 2014
On Thu, Jul 24, 2014 at 09:54:27AM +0200, Daniel Vetter wrote:
> In my review of
>
> commit 98f75de40e9d83c3a90d294b8fd25fa2874212a9
> Author: Rob Clark <robdclark at 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.
>
> Cc: Rob Clark <robdclark at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/drm_crtc.c | 6 +++---
> drivers/gpu/drm/drm_fb_helper.c | 1 +
> 2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index f0a777747907..853ab9cad071 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -429,6 +429,9 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
> if (!obj || (type != DRM_MODE_OBJECT_ANY && obj->type != type) ||
> (obj->id != id))
> obj = NULL;
> + /* don't leak out unref'd fb's */
> + if (obj && (obj->type == DRM_MODE_OBJECT_FB))
> + obj = NULL;
- if (!obj || (type != DRM_MODE_OBJECT_ANY && obj->type != type) ||
- (obj->id != id))
+ if (obj && obj->type != type && type != DRM_MODE_OBJECT_ANY)
+ obj = NULL;
+ if (obj && WARN_ON(obj->id != id))
+ obj = NULL;
+ if (obj && WARN_ON(obj->type == DRM_MODE_OBJECT_FB))
obj = NULL;
To break the checks up into simple steps and show that they are unlikely
errors?
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list