• Gustavo F. Padovan's avatar
    Bluetooth: Fix race condition on l2cap_ertm_send() · dfc909be
    Gustavo F. Padovan authored
    l2cap_ertm_send() can be called both from user context and bottom half
    context. The socket locks for that contexts are different, the user
    context uses a mutex(which can sleep) and the second one uses a
    spinlock_bh. That creates a race condition when we have interruptions on
    both contexts at the same time.
    
    The better way to solve this is to add a new spinlock to lock
    l2cap_ertm_send() and the vars it access. The other solution was to defer
    l2cap_ertm_send() with a workqueue, but we the sending process already
    has one defer on the hci layer. It's not a good idea add another one.
    
    The patch refactor the code to create l2cap_retransmit_frames(), then we
    encapulate the lock of l2cap_ertm_send() for some call. It also changes
    l2cap_retransmit_frame() to l2cap_retransmit_one_frame() to avoid
    confusion
    Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
    Reviewed-by: default avatarJoão Paulo Rechi Vita <jprvita@profusion.mobi>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    dfc909be
l2cap.c 104 KB