forked from luck/tmp_suning_uos_patched
Bluetooth: Fix decrementing reference count twice in releasing socket
When releasing socket, it is possible to enter hci_sock_release() and hci_sock_dev_event(HCI_DEV_UNREG) at the same time in different thread. The reference count of hdev should be decremented only once from one of them but if storing hdev to local variable in hci_sock_release() before detached from socket and setting to NULL in hci_sock_dev_event(), hci_dev_put(hdev) is unexpectedly called twice. This is resolved by referencing hdev from socket after bt_sock_unlink() in hci_sock_release(). Reported-by: syzbot+fdc00003f4efff43bc5b@syzkaller.appspotmail.com Signed-off-by: Myungho Jung <mhjungk@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
017a01ccfb
commit
e20a2e9c42
|
@ -831,8 +831,6 @@ static int hci_sock_release(struct socket *sock)
|
||||||
if (!sk)
|
if (!sk)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hdev = hci_pi(sk)->hdev;
|
|
||||||
|
|
||||||
switch (hci_pi(sk)->channel) {
|
switch (hci_pi(sk)->channel) {
|
||||||
case HCI_CHANNEL_MONITOR:
|
case HCI_CHANNEL_MONITOR:
|
||||||
atomic_dec(&monitor_promisc);
|
atomic_dec(&monitor_promisc);
|
||||||
|
@ -854,6 +852,7 @@ static int hci_sock_release(struct socket *sock)
|
||||||
|
|
||||||
bt_sock_unlink(&hci_sk_list, sk);
|
bt_sock_unlink(&hci_sk_list, sk);
|
||||||
|
|
||||||
|
hdev = hci_pi(sk)->hdev;
|
||||||
if (hdev) {
|
if (hdev) {
|
||||||
if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
|
if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
|
||||||
/* When releasing a user channel exclusive access,
|
/* When releasing a user channel exclusive access,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user