mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
Bluetooth: SCO: fix sco_conn refcounting on sco_conn_ready
sco_conn refcount shall not be incremented a second time if the sk
already owns the refcount, so hold only when adding new chan.
Add sco_conn_hold() for clarity, as refcnt is never zero here due to the
sco_conn_add().
Fixes SCO socket shutdown not actually closing the SCO connection.
Fixes: ed95885549 ("Bluetooth: SCO: remove the redundant sco_conn_put")
Signed-off-by: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
75ddcd5ad4
commit
8d74c9106b
|
|
@ -107,6 +107,14 @@ static void sco_conn_put(struct sco_conn *conn)
|
|||
kref_put(&conn->ref, sco_conn_free);
|
||||
}
|
||||
|
||||
static struct sco_conn *sco_conn_hold(struct sco_conn *conn)
|
||||
{
|
||||
BT_DBG("conn %p refcnt %u", conn, kref_read(&conn->ref));
|
||||
|
||||
kref_get(&conn->ref);
|
||||
return conn;
|
||||
}
|
||||
|
||||
static struct sco_conn *sco_conn_hold_unless_zero(struct sco_conn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
|
@ -1353,6 +1361,7 @@ static void sco_conn_ready(struct sco_conn *conn)
|
|||
bacpy(&sco_pi(sk)->src, &conn->hcon->src);
|
||||
bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
|
||||
|
||||
sco_conn_hold(conn);
|
||||
hci_conn_hold(conn->hcon);
|
||||
__sco_chan_add(conn, sk, parent);
|
||||
|
||||
|
|
@ -1411,8 +1420,10 @@ static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
|
|||
struct sco_conn *conn;
|
||||
|
||||
conn = sco_conn_add(hcon);
|
||||
if (conn)
|
||||
if (conn) {
|
||||
sco_conn_ready(conn);
|
||||
sco_conn_put(conn);
|
||||
}
|
||||
} else
|
||||
sco_conn_del(hcon, bt_to_errno(status));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user