[PATCH] drm: Fix race when checking for fb in the generic kms obj lookup
Rob Clark
robdclark at gmail.com
Fri Jul 25 03:16:45 PDT 2014
On Thu, Jul 24, 2014 at 6:12 AM, Daniel Vetter <daniel.vetter at ffwll.ch> 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.
>
> v2: Simplify the conditionals as suggested by Chris.
>
> Cc: Rob Clark <robdclark at gmail.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
Reviewed-by: Rob Clark <robdclark at gmail.com>
> ---
> drivers/gpu/drm/drm_crtc.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index f0a777747907..d87df8836aa5 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -426,8 +426,12 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
>
> mutex_lock(&dev->mode_config.idr_mutex);
> obj = idr_find(&dev->mode_config.crtc_idr, id);
> - if (!obj || (type != DRM_MODE_OBJECT_ANY && obj->type != type) ||
> - (obj->id != id))
> + if (obj && type != DRM_MODE_OBJECT_ANY && obj->type != type)
> + obj = NULL;
> + if (obj && obj->id != id)
> + obj = NULL;
> + /* don't leak out unref'd fb's */
> + if (obj && (obj->type == DRM_MODE_OBJECT_FB))
> obj = NULL;
> mutex_unlock(&dev->mode_config.idr_mutex);
>
> @@ -454,9 +458,6 @@ struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
> * function.*/
> WARN_ON(type == DRM_MODE_OBJECT_FB);
> obj = _object_find(dev, id, type);
> - /* don't leak out unref'd fb's */
> - if (obj && (obj->type == DRM_MODE_OBJECT_FB))
> - obj = NULL;
> return obj;
> }
> EXPORT_SYMBOL(drm_mode_object_find);
> --
> 2.0.1
>
More information about the dri-devel
mailing list