• Pauli Virtanen's avatar
    Bluetooth: SCO: fix sco_conn related locking and validity issues · 3dcaa192
    Pauli Virtanen authored
    Operations that check/update sk_state and access conn should hold
    lock_sock, otherwise they can race.
    
    The order of taking locks is hci_dev_lock > lock_sock > sco_conn_lock,
    which is how it is in connect/disconnect_cfm -> sco_conn_del ->
    sco_chan_del.
    
    Fix locking in sco_connect to take lock_sock around updating sk_state
    and conn.
    
    sco_conn_del must not occur during sco_connect, as it frees the
    sco_conn. Hold hdev->lock longer to prevent that.
    
    sco_conn_add shall return sco_conn with valid hcon. Make it so also when
    reusing an old SCO connection waiting for disconnect timeout (see
    __sco_sock_close where conn->hcon is set to NULL).
    
    This should not reintroduce the issue fixed in the earlier
    commit 9a8ec9e8 ("Bluetooth: SCO: Fix possible circular locking
    dependency on sco_connect_cfm"), the relevant fix of releasing lock_sock
    in sco_sock_connect before acquiring hdev->lock is retained.
    
    These changes mirror similar fixes earlier in ISO sockets.
    
    Fixes: 9a8ec9e8 ("Bluetooth: SCO: Fix possible circular locking dependency on sco_connect_cfm")
    Signed-off-by: default avatarPauli Virtanen <pav@iki.fi>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    3dcaa192
sco.c 29.8 KB