• Ian Abbott's avatar
    staging: comedi: do extra checks for becoming non-busy for "write" · ed65bba3
    Ian Abbott authored
    `comedi_write()` is the handler for the "write" file operation for
    COMEDI devices.  It mostly runs without using the main mutex of the
    COMEDI device, but uses the `attach_lock` rw_semaphore to protect
    against the COMEDI device becoming "detached".  A file object can write
    data for a COMEDI asynchonous command if it initiated the command.  The
    COMEDI subdevice is marked as busy when the command is started.  At some
    point, the "write" handler detects that the command has terminated and
    so marks the subdevice as non-busy.
    
    In order to mark the subdevice as non-busy, the "write" handler needs to
    release the `attach_lock` rw_semaphore and `acquire the main `mutex`.
    There is a vulnerable point between the two, so it checks that the
    device is still attached after acquiring the mutex.  However, it does
    not currently check that the conditions for becoming non-busy still
    hold.  Add some more checks that the subdevice is still busy with a
    command initiated by the same file object, and that the command is in
    the correct direction (in case the subdevice supports both "read" and
    "write").
    Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ed65bba3
comedi_fops.c 66.5 KB