mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
Bluetooth: Refcnt drop must be placed last in hci_conn_unlink
commit2910431ab0
upstream. If hci_conn_put(conn->parent) reduces conn->parent's reference count to zero, it can immediately deallocate conn->parent. At the same time, conn->link->list has its head in conn->parent, causing use-after-free problems in the latter list_del_rcu(&conn->link->list). This problem can be easily solved by reordering the two operations, i.e., first performing the list removal with list_del_rcu and then decreasing the refcnt with hci_conn_put. Reported-by: Luiz Augusto von Dentz <luiz.dentz@gmail.com> Closes: https://lore.kernel.org/linux-bluetooth/CABBYNZ+1kce8_RJrLNOXd_8=Mdpb=2bx4Nto-hFORk=qiOkoCg@mail.gmail.com/ Fixes:06149746e7
("Bluetooth: hci_conn: Add support for linking multiple hcon") Signed-off-by: Ruihan Li <lrh2000@pku.edu.cn> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
75e35bd4b7
commit
f864d47132
1 changed files with 3 additions and 3 deletions
|
@ -1107,12 +1107,12 @@ static void hci_conn_unlink(struct hci_conn *conn)
|
|||
if (!conn->link)
|
||||
return;
|
||||
|
||||
hci_conn_put(conn->parent);
|
||||
conn->parent = NULL;
|
||||
|
||||
list_del_rcu(&conn->link->list);
|
||||
synchronize_rcu();
|
||||
|
||||
hci_conn_put(conn->parent);
|
||||
conn->parent = NULL;
|
||||
|
||||
kfree(conn->link);
|
||||
conn->link = NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue