• James Hogan's avatar
    HID: hidraw: protect hidraw_disconnect() better · 65b01bd5
    James Hogan authored
    The function hidraw_disconnect() only acquires the hidraw minors_lock
    when clearing the entry in hidraw_table. However the device_destroy()
    call can cause a userland read/write to return with an error. It may
    cause the program to release the file descripter before the disconnect
    is finished. hidraw_disconnect() has already set hidraw->exist to 0,
    which makes hidraw_release() kfree the hidraw structure, which
    hidraw_disconnect() continues to access and even tries to kfree again.
    Similarly if a hidraw_release() occurs after setting hidraw->exist to 0,
    the same thing can happen.
    
    This is fixed by expanding the mutex critical section to cover the whole
    function from setting hidraw->exist to 0 to freeing the hidraw
    structure, preventing a hidraw_release() from interfering.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Tested-by: default avatarDavid Herrmann <dh.herrmann@googlemail.com>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    65b01bd5
hidraw.c 12.4 KB