• Chris Wilson's avatar
    drm/i915: Sanity check execbuffer arguments before touching state. · 83d60795
    Chris Wilson authored
    By sending a broken execbuffer (its length was not suitably aligned) I
    triggered an operation upon a freed object. The invalid alignment was
    discovered after updating the write_domain on the object but before the
    object was placed on the active queue. So during the unwind process
    following the error, the now freed object attempts to flush its
    non-existent, but outstanding, GPU writes causing this use-after-free.
    
    [drm:i915_dispatch_gem_execbuffer] *ERROR* alignment
    [drm:i915_gem_execbuffer] *ERROR* dispatch failed -22
    WARNING: at lib/kref.c:43 warn_slowpath_null+0x10/0x15()
    Modules linked in:
    Pid: 4552, comm: lt-csi-drm Not tainted 2.6.30-rc6 #423
    Call Trace:
     [<c0119ef3>] warn_slowpath_fmt+0x57/0x6d
     [<c014de24>] ? get_pageblock_migratetype+0x18/0x1e
     [<c014e8fd>] ? free_hot_page+0xa/0xc
     [<c014e915>] ? __free_pages+0x16/0x1f
     [<c0153ebf>] ? shmem_truncate_range+0x63e/0x656
     [<c015fb2f>] ? slob_page_alloc+0x146/0x1c8
     [<c0119f19>] warn_slowpath_null+0x10/0x15
     [<c01f55f2>] kref_get+0x1b/0x21
     [<c02605db>] i915_gem_object_move_to_active+0x1f/0x56
     [<c0261302>] i915_add_request+0x156/0x19a
     [<c026136e>] i915_gem_object_flush_gpu_write_domain+0x28/0x3f
     [<c0261eca>] i915_gem_object_unbind+0x4a/0x124
     [<c0261fd7>] i915_gem_free_object+0x33/0x9b
     [<c0250d6b>] drm_gem_object_free+0x28/0x4a
     [<c0250d43>] ? drm_gem_object_free+0x0/0x4a
     [<c01f55ce>] kref_put+0x38/0x41
     [<c0250cbf>] drm_gem_object_unreference+0x11/0x13
     [<c0250d06>] drm_gem_object_handle_unreference+0x1e/0x21
     [<c0250d13>] drm_gem_object_release_handle+0xa/0xe
     [<c01f3e6b>] idr_for_each+0x5f/0x98
     [<c0250d09>] ? drm_gem_object_release_handle+0x0/0xe
     [<c0250daf>] drm_gem_release+0x22/0x34
     [<c025046f>] drm_release+0x1e8/0x3c4
     [<c0162d25>] __fput+0xaf/0x146
     [<c0162dce>] fput+0x12/0x14
     [<c01605ef>] filp_close+0x48/0x52
     [<c011b182>] put_files_struct+0x57/0x9b
     [<c011b1e4>] exit_files+0x1e/0x20
     [<c011c6b6>] do_exit+0x16d/0x511
     [<c03704ab>] ? __schedule+0x3d4/0x3e5
     [<c0103f0d>] ? handle_irq+0xd/0x69
     [<c011caa7>] do_group_exit+0x4d/0x73
     [<c011cae0>] sys_exit_group+0x13/0x17
     [<c010268c>] sysenter_do_call+0x12/0x2b
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: default avatarEric Anholt <eric@anholt.net>
    83d60795
i915_gem.c 116 KB