• EunTaik Lee's avatar
    staging/android/ion : fix a race condition in the ion driver · a7544fdd
    EunTaik Lee authored
    commit 9590232b upstream.
    
    There is a use-after-free problem in the ion driver.
    This is caused by a race condition in the ion_ioctl()
    function.
    
    A handle has ref count of 1 and two tasks on different
    cpus calls ION_IOC_FREE simultaneously.
    
    cpu 0                                   cpu 1
    -------------------------------------------------------
    ion_handle_get_by_id()
    (ref == 2)
                                ion_handle_get_by_id()
                                (ref == 3)
    
    ion_free()
    (ref == 2)
    
    ion_handle_put()
    (ref == 1)
    
                                ion_free()
                                (ref == 0 so ion_handle_destroy() is
                                called
                                and the handle is freed.)
    
                                ion_handle_put() is called and it
                                decreases the slub's next free pointer
    
    The problem is detected as an unaligned access in the
    spin lock functions since it uses load exclusive
     instruction. In some cases it corrupts the slub's
    free pointer which causes a mis-aligned access to the
    next free pointer.(kmalloc returns a pointer like
    ffffc0745b4580aa). And it causes lots of other
    hard-to-debug problems.
    
    This symptom is caused since the first member in the
    ion_handle structure is the reference count and the
    ion driver decrements the reference after it has been
    freed.
    
    To fix this problem client->lock mutex is extended
    to protect all the codes that uses the handle.
    Signed-off-by: default avatarEun Taik Lee <eun.taik.lee@samsung.com>
    Reviewed-by: default avatarLaura Abbott <labbott@redhat.com>
    Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    
    index 7ff2a7ec871f..33b390e7ea31
    a7544fdd
ion.c 40.9 KB