• Kuba Pawlak's avatar
    Bluetooth: Fix locking issue during fast SCO reconnection. · 1da5537e
    Kuba Pawlak authored
    When SCO connection is requested and disconnected fast, there is a change
    that sco_sock_shutdown is going to preempt thread started in sco_connect_cfm.
    When this happens struct sock sk may be removed but a pointer to it is still
    held in sco_conn_ready, where embedded spinlock is used. If it is used, but
    struct sock has been removed, it will crash.
    
    Block connection object, which will prevent struct sock from being removed
    and give connection process chance to finish.
    
    BUG: spinlock bad magic on CPU#0, kworker/u:2H/319
     lock: 0xe3e99434, .magic: f3000000, .owner: (���/0, .owner_cpu: -203804160
    Pid: 319, comm: kworker/u:2H Tainted: G           O 3.8.0-115.1-plk-adaptation-byt-ivi-brd #1
    Call Trace:
     [<c1155659>] ? do_raw_spin_lock+0x19/0xe9
     [<fb75354f>] ? sco_connect_cfm+0x92/0x236 [bluetooth]
     [<fb731dbc>] ? hci_sync_conn_complete_evt.clone.101+0x18b/0x1cb [bluetooth]
     [<fb734ee7>] ? hci_event_packet+0x1acd/0x21a6 [bluetooth]
     [<c1041095>] ? finish_task_switch+0x50/0x89
     [<c1349a2e>] ? __schedule+0x638/0x6b8
     [<fb727918>] ? hci_rx_work+0xb9/0x2b8 [bluetooth]
     [<c103760a>] ? queue_delayed_work_on+0x21/0x2a
     [<c1035df9>] ? process_one_work+0x157/0x21b
     [<fb72785f>] ? hci_cmd_work+0xef/0xef [bluetooth]
     [<c1036217>] ? worker_thread+0x16e/0x20a
     [<c10360a9>] ? manage_workers+0x1cf/0x1cf
     [<c103a0ef>] ? kthread+0x8d/0x92
     [<c134adf7>] ? ret_from_kernel_thread+0x1b/0x28
     [<c103a062>] ? __init_kthread_worker+0x24/0x24
    BUG: unable to handle kernel NULL pointer dereference at   (null)
    IP: [<  (null)>]   (null)
    *pdpt = 00000000244e1001 *pde = 0000000000000000
    Oops: 0010 [#1] PREEMPT SMP
    Modules linked in: evdev ecb rfcomm(O) libcomposite usb2380 udc_core bnep(O) btusb(O) btbcm(O) cdc_acm btintel(O) bluetooth(O) arc4 uinput hid_multitouch usbhid hid iwlmvm(O)e
    Pid: 319, comm: kworker/u:2H Tainted: G           O 3.8.0-115.1-plk-adaptation-byt-ivi-brd #1
    EIP: 0060:[<00000000>] EFLAGS: 00010246 CPU: 0
    EIP is at 0x0
    EAX: e3e99400 EBX: e3e99400 ECX: 00000100 EDX: 00000000
    ESI: e3e99434 EDI: fb763ce0 EBP: e49b9e44 ESP: e49b9e14
     DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
    CR0: 8005003b CR2: 00000000 CR3: 24444000 CR4: 001007f0
    DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
    DR6: ffff0ff0 DR7: 00000400
    Process kworker/u:2H (pid: 319, ti=e49b8000 task=e4ab9030 task.ti=e49b8000)
    Stack:
     fb75355b 00000246 fb763900 22222222 22222222 22222222 e3f94460 e3ca7c0a
     e49b9e4c e3f34c00 e3ca7c0a fb763ce0 e49b9e6c fb731dbc 02000246 e4cec85c
     e4cec008 00000000 e3f34c00 e4cec000 e3c2ce00 0000002c e49b9ed0 fb734ee7
    Call Trace:
     [<fb75355b>] ? sco_connect_cfm+0x9e/0x236 [bluetooth]
     [<fb731dbc>] ? hci_sync_conn_complete_evt.clone.101+0x18b/0x1cb [bluetooth]
     [<fb734ee7>] ? hci_event_packet+0x1acd/0x21a6 [bluetooth]
     [<c1041095>] ? finish_task_switch+0x50/0x89
     [<c1349a2e>] ? __schedule+0x638/0x6b8
     [<fb727918>] ? hci_rx_work+0xb9/0x2b8 [bluetooth]
     [<c103760a>] ? queue_delayed_work_on+0x21/0x2a
     [<c1035df9>] ? process_one_work+0x157/0x21b
     [<fb72785f>] ? hci_cmd_work+0xef/0xef [bluetooth]
     [<c1036217>] ? worker_thread+0x16e/0x20a
     [<c10360a9>] ? manage_workers+0x1cf/0x1cf
     [<c103a0ef>] ? kthread+0x8d/0x92
     [<c134adf7>] ? ret_from_kernel_thread+0x1b/0x28
     [<c103a062>] ? __init_kthread_worker+0x24/0x24
    Code:  Bad EIP value.
    EIP: [<00000000>] 0x0 SS:ESP 0068:e49b9e14
    CR2: 0000000000000000
    ---[ end trace 942a6577c0abd725 ]---
    Signed-off-by: default avatarKuba Pawlak <kubax.t.pawlak@intel.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    1da5537e
sco.c 24.5 KB