drm/i915: Fix use after free in logical_render_ring_init
authorTvrtko Ursulin <[email protected]>
Fri, 16 Dec 2016 13:18:42 +0000 (13:18 +0000)
committerTvrtko Ursulin <[email protected]>
Fri, 16 Dec 2016 14:30:00 +0000 (14:30 +0000)
Commit 3b3f1650b1ca ("drm/i915: Allocate intel_engine_cs
structure only for the enabled engines") introduced the
dynanically allocated engine instances and created an
potential use after free scenario in logical_render_ring_init
where lrc_destroy_wa_ctx_obj could be called after the engine
instance has been freed.

This can only happen during engine setup/init error handling
which luckily does not happen ever in practice.

Fix is to not call lrc_destroy_wa_ctx_obj since it would have
already been executed from the preceding engine cleanup.

Signed-off-by: Tvrtko Ursulin <[email protected]>
Reported-by: Dan Carpenter <[email protected]>
Fixes: 3b3f1650b1ca ("drm/i915: Allocate intel_engine_cs structure only for the enabled engines")
Cc: Chris Wilson <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Tvrtko Ursulin <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Jani Nikula <[email protected]>
Reviewed-by: Chris Wilson <[email protected]>
Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
drivers/gpu/drm/i915/intel_lrc.c

index 8b412880e88c1b18f67109e40062e64fc157aa20..877adedbf833857bf262384b94c93c14d1c1f7ad 100644 (file)
@@ -1965,12 +1965,7 @@ int logical_render_ring_init(struct intel_engine_cs *engine)
                          ret);
        }
 
-       ret = logical_ring_init(engine);
-       if (ret) {
-               lrc_destroy_wa_ctx_obj(engine);
-       }
-
-       return ret;
+       return logical_ring_init(engine);
 }
 
 int logical_xcs_ring_init(struct intel_engine_cs *engine)