+++ /dev/null
-From 1b8851da51113f6a7f01297823eaf22b4b772063 Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Wed, 13 Nov 2024 15:43:55 +0100
-Subject: Revert "Bluetooth: af_bluetooth: Fix deadlock"
-
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-This reverts commit cb8adca52f306563d958a863bb0cbae9c184d1ae which is
-commit f7b94bdc1ec107c92262716b073b3e816d4784fb upstream.
-
-It is reported to cause regressions in the 6.1.y tree, so revert it for
-now.
-
-Link: https://lore.kernel.org/all/CADRbXaDqx6S+7tzdDPPEpRu9eDLrHQkqoWTTGfKJSRxY=hT5MQ@mail.gmail.com/
-Reported-by: Jeremy Lainé <jeremy.laine@m4x.org>
-Cc: Salvatore Bonaccorso <carnil@debian.org>
-Cc: Mike <user.service2016@gmail.com>
-Cc: Marcel Holtmann <marcel@holtmann.org>
-Cc: Johan Hedberg <johan.hedberg@gmail.com>
-Cc: Paul Menzel <pmenzel@molgen.mpg.de>
-Cc: Pauli Virtanen <pav@iki.fi>
-Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Cc: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/bluetooth/af_bluetooth.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
---- a/net/bluetooth/af_bluetooth.c
-+++ b/net/bluetooth/af_bluetooth.c
-@@ -307,11 +307,14 @@ int bt_sock_recvmsg(struct socket *sock,
- if (flags & MSG_OOB)
- return -EOPNOTSUPP;
-
-+ lock_sock(sk);
-+
- skb = skb_recv_datagram(sk, flags, &err);
- if (!skb) {
- if (sk->sk_shutdown & RCV_SHUTDOWN)
- err = 0;
-
-+ release_sock(sk);
- return err;
- }
-
-@@ -337,6 +340,8 @@ int bt_sock_recvmsg(struct socket *sock,
-
- skb_free_datagram(sk, skb);
-
-+ release_sock(sk);
-+
- if (flags & MSG_TRUNC)
- copied = skblen;
-
-@@ -559,11 +564,10 @@ int bt_sock_ioctl(struct socket *sock, u
- if (sk->sk_state == BT_LISTEN)
- return -EINVAL;
-
-- spin_lock(&sk->sk_receive_queue.lock);
-+ lock_sock(sk);
- skb = skb_peek(&sk->sk_receive_queue);
- amount = skb ? skb->len : 0;
-- spin_unlock(&sk->sk_receive_queue.lock);
--
-+ release_sock(sk);
- err = put_user(amount, (int __user *)arg);
- break;
-
+++ /dev/null
-From bb6015962fa5e0f3b624c605e502fc0b29c325ff Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Wed, 13 Nov 2024 15:42:18 +0100
-Subject: Revert "Bluetooth: fix use-after-free in accessing skb after sending it"
-
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-This reverts commit 715264ad09fd4004e347cdb79fa58a4f2344f13f which is
-commit 947ec0d002dce8577b655793dcc6fc78d67b7cb6 upstream.
-
-It is reported to cause regressions in the 6.1.y tree, so revert it for
-now.
-
-Link: https://lore.kernel.org/all/CADRbXaDqx6S+7tzdDPPEpRu9eDLrHQkqoWTTGfKJSRxY=hT5MQ@mail.gmail.com/
-Reported-by: Jeremy Lainé <jeremy.laine@m4x.org>
-Cc: Salvatore Bonaccorso <carnil@debian.org>
-Cc: Mike <user.service2016@gmail.com>
-Cc: Marcel Holtmann <marcel@holtmann.org>
-Cc: Johan Hedberg <johan.hedberg@gmail.com>
-Cc: Paul Menzel <pmenzel@molgen.mpg.de>
-Cc: Pauli Virtanen <pav@iki.fi>
-Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Cc: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/bluetooth/hci_core.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/net/bluetooth/hci_core.c
-+++ b/net/bluetooth/hci_core.c
-@@ -4146,7 +4146,7 @@ static void hci_send_cmd_sync(struct hci
- if (hci_req_status_pend(hdev) &&
- !hci_dev_test_and_set_flag(hdev, HCI_CMD_PENDING)) {
- kfree_skb(hdev->req_skb);
-- hdev->req_skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
-+ hdev->req_skb = skb_clone(skb, GFP_KERNEL);
- }
-
- atomic_dec(&hdev->cmd_cnt);
+++ /dev/null
-From 898205b3df400a1d9e8311778fae9219e526c444 Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Wed, 13 Nov 2024 15:45:02 +0100
-Subject: Revert "Bluetooth: hci_conn: Consolidate code for aborting connections"
-
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-This reverts commit 6083089ab00631617f9eac678df3ab050a9d837a which is
-commit a13f316e90fdb1fb6df6582e845aa9b3270f3581 upstream.
-
-It is reported to cause regressions in the 6.1.y tree, so revert it for
-now.
-
-Link: https://lore.kernel.org/all/CADRbXaDqx6S+7tzdDPPEpRu9eDLrHQkqoWTTGfKJSRxY=hT5MQ@mail.gmail.com/
-Reported-by: Jeremy Lainé <jeremy.laine@m4x.org>
-Cc: Salvatore Bonaccorso <carnil@debian.org>
-Cc: Mike <user.service2016@gmail.com>
-Cc: Marcel Holtmann <marcel@holtmann.org>
-Cc: Johan Hedberg <johan.hedberg@gmail.com>
-Cc: Paul Menzel <pmenzel@molgen.mpg.de>
-Cc: Pauli Virtanen <pav@iki.fi>
-Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Cc: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- include/net/bluetooth/hci_core.h | 2
- net/bluetooth/hci_conn.c | 156 +++++++++++++++++++++++++++++++--------
- net/bluetooth/hci_sync.c | 23 ++---
- net/bluetooth/mgmt.c | 15 +++
- 4 files changed, 148 insertions(+), 48 deletions(-)
-
---- a/include/net/bluetooth/hci_core.h
-+++ b/include/net/bluetooth/hci_core.h
-@@ -734,7 +734,6 @@ struct hci_conn {
- unsigned long flags;
-
- enum conn_reasons conn_reason;
-- __u8 abort_reason;
-
- __u32 clock;
- __u16 clock_accuracy;
-@@ -754,6 +753,7 @@ struct hci_conn {
- struct delayed_work auto_accept_work;
- struct delayed_work idle_work;
- struct delayed_work le_conn_timeout;
-+ struct work_struct le_scan_cleanup;
-
- struct device dev;
- struct dentry *debugfs;
---- a/net/bluetooth/hci_conn.c
-+++ b/net/bluetooth/hci_conn.c
-@@ -174,6 +174,57 @@ static void hci_conn_cleanup(struct hci_
- hci_dev_put(hdev);
- }
-
-+static void le_scan_cleanup(struct work_struct *work)
-+{
-+ struct hci_conn *conn = container_of(work, struct hci_conn,
-+ le_scan_cleanup);
-+ struct hci_dev *hdev = conn->hdev;
-+ struct hci_conn *c = NULL;
-+
-+ BT_DBG("%s hcon %p", hdev->name, conn);
-+
-+ hci_dev_lock(hdev);
-+
-+ /* Check that the hci_conn is still around */
-+ rcu_read_lock();
-+ list_for_each_entry_rcu(c, &hdev->conn_hash.list, list) {
-+ if (c == conn)
-+ break;
-+ }
-+ rcu_read_unlock();
-+
-+ if (c == conn) {
-+ hci_connect_le_scan_cleanup(conn, 0x00);
-+ hci_conn_cleanup(conn);
-+ }
-+
-+ hci_dev_unlock(hdev);
-+ hci_dev_put(hdev);
-+ hci_conn_put(conn);
-+}
-+
-+static void hci_connect_le_scan_remove(struct hci_conn *conn)
-+{
-+ BT_DBG("%s hcon %p", conn->hdev->name, conn);
-+
-+ /* We can't call hci_conn_del/hci_conn_cleanup here since that
-+ * could deadlock with another hci_conn_del() call that's holding
-+ * hci_dev_lock and doing cancel_delayed_work_sync(&conn->disc_work).
-+ * Instead, grab temporary extra references to the hci_dev and
-+ * hci_conn and perform the necessary cleanup in a separate work
-+ * callback.
-+ */
-+
-+ hci_dev_hold(conn->hdev);
-+ hci_conn_get(conn);
-+
-+ /* Even though we hold a reference to the hdev, many other
-+ * things might get cleaned up meanwhile, including the hdev's
-+ * own workqueue, so we can't use that for scheduling.
-+ */
-+ schedule_work(&conn->le_scan_cleanup);
-+}
-+
- static void hci_acl_create_connection(struct hci_conn *conn)
- {
- struct hci_dev *hdev = conn->hdev;
-@@ -625,6 +676,13 @@ static void hci_conn_timeout(struct work
- if (refcnt > 0)
- return;
-
-+ /* LE connections in scanning state need special handling */
-+ if (conn->state == BT_CONNECT && conn->type == LE_LINK &&
-+ test_bit(HCI_CONN_SCANNING, &conn->flags)) {
-+ hci_connect_le_scan_remove(conn);
-+ return;
-+ }
-+
- hci_abort_conn(conn, hci_proto_disconn_ind(conn));
- }
-
-@@ -996,6 +1054,7 @@ struct hci_conn *hci_conn_add(struct hci
- INIT_DELAYED_WORK(&conn->auto_accept_work, hci_conn_auto_accept);
- INIT_DELAYED_WORK(&conn->idle_work, hci_conn_idle);
- INIT_DELAYED_WORK(&conn->le_conn_timeout, le_conn_timeout);
-+ INIT_WORK(&conn->le_scan_cleanup, le_scan_cleanup);
-
- atomic_set(&conn->refcnt, 0);
-
-@@ -2781,46 +2840,81 @@ u32 hci_conn_get_phy(struct hci_conn *co
- return phys;
- }
-
--static int abort_conn_sync(struct hci_dev *hdev, void *data)
-+int hci_abort_conn(struct hci_conn *conn, u8 reason)
- {
-- struct hci_conn *conn;
-- u16 handle = PTR_ERR(data);
-+ int r = 0;
-
-- conn = hci_conn_hash_lookup_handle(hdev, handle);
-- if (!conn)
-+ if (test_and_set_bit(HCI_CONN_CANCEL, &conn->flags))
- return 0;
-
-- return hci_abort_conn_sync(hdev, conn, conn->abort_reason);
--}
--
--int hci_abort_conn(struct hci_conn *conn, u8 reason)
--{
-- struct hci_dev *hdev = conn->hdev;
-+ switch (conn->state) {
-+ case BT_CONNECTED:
-+ case BT_CONFIG:
-+ if (conn->type == AMP_LINK) {
-+ struct hci_cp_disconn_phy_link cp;
-+
-+ cp.phy_handle = HCI_PHY_HANDLE(conn->handle);
-+ cp.reason = reason;
-+ r = hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
-+ sizeof(cp), &cp);
-+ } else {
-+ struct hci_cp_disconnect dc;
-
-- /* If abort_reason has already been set it means the connection is
-- * already being aborted so don't attempt to overwrite it.
-- */
-- if (conn->abort_reason)
-- return 0;
-+ dc.handle = cpu_to_le16(conn->handle);
-+ dc.reason = reason;
-+ r = hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT,
-+ sizeof(dc), &dc);
-+ }
-
-- bt_dev_dbg(hdev, "handle 0x%2.2x reason 0x%2.2x", conn->handle, reason);
-+ conn->state = BT_DISCONN;
-
-- conn->abort_reason = reason;
-+ break;
-+ case BT_CONNECT:
-+ if (conn->type == LE_LINK) {
-+ if (test_bit(HCI_CONN_SCANNING, &conn->flags))
-+ break;
-+ r = hci_send_cmd(conn->hdev,
-+ HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
-+ } else if (conn->type == ACL_LINK) {
-+ if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2)
-+ break;
-+ r = hci_send_cmd(conn->hdev,
-+ HCI_OP_CREATE_CONN_CANCEL,
-+ 6, &conn->dst);
-+ }
-+ break;
-+ case BT_CONNECT2:
-+ if (conn->type == ACL_LINK) {
-+ struct hci_cp_reject_conn_req rej;
-+
-+ bacpy(&rej.bdaddr, &conn->dst);
-+ rej.reason = reason;
-+
-+ r = hci_send_cmd(conn->hdev,
-+ HCI_OP_REJECT_CONN_REQ,
-+ sizeof(rej), &rej);
-+ } else if (conn->type == SCO_LINK || conn->type == ESCO_LINK) {
-+ struct hci_cp_reject_sync_conn_req rej;
-+
-+ bacpy(&rej.bdaddr, &conn->dst);
-+
-+ /* SCO rejection has its own limited set of
-+ * allowed error values (0x0D-0x0F) which isn't
-+ * compatible with most values passed to this
-+ * function. To be safe hard-code one of the
-+ * values that's suitable for SCO.
-+ */
-+ rej.reason = HCI_ERROR_REJ_LIMITED_RESOURCES;
-
-- /* If the connection is pending check the command opcode since that
-- * might be blocking on hci_cmd_sync_work while waiting its respective
-- * event so we need to hci_cmd_sync_cancel to cancel it.
-- */
-- if (conn->state == BT_CONNECT && hdev->req_status == HCI_REQ_PEND) {
-- switch (hci_skb_event(hdev->sent_cmd)) {
-- case HCI_EV_LE_CONN_COMPLETE:
-- case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
-- case HCI_EVT_LE_CIS_ESTABLISHED:
-- hci_cmd_sync_cancel(hdev, -ECANCELED);
-- break;
-+ r = hci_send_cmd(conn->hdev,
-+ HCI_OP_REJECT_SYNC_CONN_REQ,
-+ sizeof(rej), &rej);
- }
-+ break;
-+ default:
-+ conn->state = BT_CLOSED;
-+ break;
- }
-
-- return hci_cmd_sync_queue(hdev, abort_conn_sync, ERR_PTR(conn->handle),
-- NULL);
-+ return r;
- }
---- a/net/bluetooth/hci_sync.c
-+++ b/net/bluetooth/hci_sync.c
-@@ -5293,27 +5293,22 @@ static int hci_disconnect_sync(struct hc
- }
-
- static int hci_le_connect_cancel_sync(struct hci_dev *hdev,
-- struct hci_conn *conn, u8 reason)
-+ struct hci_conn *conn)
- {
-- /* Return reason if scanning since the connection shall probably be
-- * cleanup directly.
-- */
- if (test_bit(HCI_CONN_SCANNING, &conn->flags))
-- return reason;
-+ return 0;
-
-- if (conn->role == HCI_ROLE_SLAVE ||
-- test_and_set_bit(HCI_CONN_CANCEL, &conn->flags))
-+ if (test_and_set_bit(HCI_CONN_CANCEL, &conn->flags))
- return 0;
-
- return __hci_cmd_sync_status(hdev, HCI_OP_LE_CREATE_CONN_CANCEL,
- 0, NULL, HCI_CMD_TIMEOUT);
- }
-
--static int hci_connect_cancel_sync(struct hci_dev *hdev, struct hci_conn *conn,
-- u8 reason)
-+static int hci_connect_cancel_sync(struct hci_dev *hdev, struct hci_conn *conn)
- {
- if (conn->type == LE_LINK)
-- return hci_le_connect_cancel_sync(hdev, conn, reason);
-+ return hci_le_connect_cancel_sync(hdev, conn);
-
- if (hdev->hci_ver < BLUETOOTH_VER_1_2)
- return 0;
-@@ -5366,11 +5361,9 @@ int hci_abort_conn_sync(struct hci_dev *
- case BT_CONFIG:
- return hci_disconnect_sync(hdev, conn, reason);
- case BT_CONNECT:
-- err = hci_connect_cancel_sync(hdev, conn, reason);
-+ err = hci_connect_cancel_sync(hdev, conn);
- /* Cleanup hci_conn object if it cannot be cancelled as it
-- * likelly means the controller and host stack are out of sync
-- * or in case of LE it was still scanning so it can be cleanup
-- * safely.
-+ * likelly means the controller and host stack are out of sync.
- */
- if (err) {
- hci_dev_lock(hdev);
-@@ -6285,7 +6278,7 @@ int hci_le_create_conn_sync(struct hci_d
-
- done:
- if (err == -ETIMEDOUT)
-- hci_le_connect_cancel_sync(hdev, conn, 0x00);
-+ hci_le_connect_cancel_sync(hdev, conn);
-
- /* Re-enable advertising after the connection attempt is finished. */
- hci_resume_advertising_sync(hdev);
---- a/net/bluetooth/mgmt.c
-+++ b/net/bluetooth/mgmt.c
-@@ -3600,6 +3600,18 @@ unlock:
- return err;
- }
-
-+static int abort_conn_sync(struct hci_dev *hdev, void *data)
-+{
-+ struct hci_conn *conn;
-+ u16 handle = PTR_ERR(data);
-+
-+ conn = hci_conn_hash_lookup_handle(hdev, handle);
-+ if (!conn)
-+ return 0;
-+
-+ return hci_abort_conn_sync(hdev, conn, HCI_ERROR_REMOTE_USER_TERM);
-+}
-+
- static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
- u16 len)
- {
-@@ -3650,7 +3662,8 @@ static int cancel_pair_device(struct soc
- le_addr_type(addr->type));
-
- if (conn->conn_reason == CONN_REASON_PAIR_DEVICE)
-- hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
-+ hci_cmd_sync_queue(hdev, abort_conn_sync, ERR_PTR(conn->handle),
-+ NULL);
-
- unlock:
- hci_dev_unlock(hdev);
+++ /dev/null
-From ed41cfef23ae134993de32a77ed6a30df2b5bb2a Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Wed, 13 Nov 2024 15:44:07 +0100
-Subject: Revert "Bluetooth: hci_core: Fix possible buffer overflow"
-
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-This reverts commit 68644bf5ec6baaff40fc39b3529c874bfda709bd which is
-commit 81137162bfaa7278785b24c1fd2e9e74f082e8e4 upstream.
-
-It is reported to cause regressions in the 6.1.y tree, so revert it for
-now.
-
-Link: https://lore.kernel.org/all/CADRbXaDqx6S+7tzdDPPEpRu9eDLrHQkqoWTTGfKJSRxY=hT5MQ@mail.gmail.com/
-Reported-by: Jeremy Lainé <jeremy.laine@m4x.org>
-Cc: Salvatore Bonaccorso <carnil@debian.org>
-Cc: Mike <user.service2016@gmail.com>
-Cc: Marcel Holtmann <marcel@holtmann.org>
-Cc: Johan Hedberg <johan.hedberg@gmail.com>
-Cc: Paul Menzel <pmenzel@molgen.mpg.de>
-Cc: Pauli Virtanen <pav@iki.fi>
-Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Cc: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/bluetooth/hci_core.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/net/bluetooth/hci_core.c
-+++ b/net/bluetooth/hci_core.c
-@@ -869,7 +869,7 @@ int hci_get_dev_info(void __user *arg)
- else
- flags = hdev->flags;
-
-- strscpy(di.name, hdev->name, sizeof(di.name));
-+ strcpy(di.name, hdev->name);
- di.bdaddr = hdev->bdaddr;
- di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
- di.flags = flags;
+++ /dev/null
-From 9cb0d1e2bf8f7faeb42466768b46f0cf2da80941 Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Date: Wed, 13 Nov 2024 15:42:48 +0100
-Subject: Revert "Bluetooth: hci_sync: Fix overwriting request callback"
-
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-This reverts commit da77c1d39bc527b31890bfa0405763c82828defb which is
-commit 2615fd9a7c2507eb3be3fbe49dcec88a2f56454a upstream.
-
-It is reported to cause regressions in the 6.1.y tree, so revert it for
-now.
-
-Link: https://lore.kernel.org/all/CADRbXaDqx6S+7tzdDPPEpRu9eDLrHQkqoWTTGfKJSRxY=hT5MQ@mail.gmail.com/
-Reported-by: Jeremy Lainé <jeremy.laine@m4x.org>
-Cc: Salvatore Bonaccorso <carnil@debian.org>
-Cc: Mike <user.service2016@gmail.com>
-Cc: Marcel Holtmann <marcel@holtmann.org>
-Cc: Johan Hedberg <johan.hedberg@gmail.com>
-Cc: Paul Menzel <pmenzel@molgen.mpg.de>
-Cc: Pauli Virtanen <pav@iki.fi>
-Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Cc: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- include/net/bluetooth/hci_core.h | 1
- net/bluetooth/hci_conn.c | 2 -
- net/bluetooth/hci_core.c | 46 +++++++++++----------------------------
- net/bluetooth/hci_event.c | 18 +++++++--------
- net/bluetooth/hci_sync.c | 21 ++---------------
- 5 files changed, 27 insertions(+), 61 deletions(-)
-
---- a/include/net/bluetooth/hci_core.h
-+++ b/include/net/bluetooth/hci_core.h
-@@ -544,7 +544,6 @@ struct hci_dev {
- __u32 req_status;
- __u32 req_result;
- struct sk_buff *req_skb;
-- struct sk_buff *req_rsp;
-
- void *smp_data;
- void *smp_bredr_data;
---- a/net/bluetooth/hci_conn.c
-+++ b/net/bluetooth/hci_conn.c
-@@ -2816,7 +2816,7 @@ int hci_abort_conn(struct hci_conn *conn
- case HCI_EV_LE_CONN_COMPLETE:
- case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
- case HCI_EVT_LE_CIS_ESTABLISHED:
-- hci_cmd_sync_cancel(hdev, ECANCELED);
-+ hci_cmd_sync_cancel(hdev, -ECANCELED);
- break;
- }
- }
---- a/net/bluetooth/hci_core.c
-+++ b/net/bluetooth/hci_core.c
-@@ -1452,8 +1452,8 @@ static void hci_cmd_timeout(struct work_
- struct hci_dev *hdev = container_of(work, struct hci_dev,
- cmd_timer.work);
-
-- if (hdev->req_skb) {
-- u16 opcode = hci_skb_opcode(hdev->req_skb);
-+ if (hdev->sent_cmd) {
-+ u16 opcode = hci_skb_opcode(hdev->sent_cmd);
-
- bt_dev_err(hdev, "command 0x%4.4x tx timeout", opcode);
-
-@@ -2762,7 +2762,6 @@ void hci_release_dev(struct hci_dev *hde
-
- ida_simple_remove(&hci_index_ida, hdev->id);
- kfree_skb(hdev->sent_cmd);
-- kfree_skb(hdev->req_skb);
- kfree_skb(hdev->recv_event);
- kfree(hdev);
- }
-@@ -3092,33 +3091,21 @@ int __hci_cmd_send(struct hci_dev *hdev,
- EXPORT_SYMBOL(__hci_cmd_send);
-
- /* Get data from the previously sent command */
--static void *hci_cmd_data(struct sk_buff *skb, __u16 opcode)
-+void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
- {
- struct hci_command_hdr *hdr;
-
-- if (!skb || skb->len < HCI_COMMAND_HDR_SIZE)
-+ if (!hdev->sent_cmd)
- return NULL;
-
-- hdr = (void *)skb->data;
-+ hdr = (void *) hdev->sent_cmd->data;
-
- if (hdr->opcode != cpu_to_le16(opcode))
- return NULL;
-
-- return skb->data + HCI_COMMAND_HDR_SIZE;
--}
-+ BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
-
--/* Get data from the previously sent command */
--void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
--{
-- void *data;
--
-- /* Check if opcode matches last sent command */
-- data = hci_cmd_data(hdev->sent_cmd, opcode);
-- if (!data)
-- /* Check if opcode matches last request */
-- data = hci_cmd_data(hdev->req_skb, opcode);
--
-- return data;
-+ return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
- }
-
- /* Get data from last received event */
-@@ -4014,19 +4001,17 @@ void hci_req_cmd_complete(struct hci_dev
- if (!status && !hci_req_is_complete(hdev))
- return;
-
-- skb = hdev->req_skb;
--
- /* If this was the last command in a request the complete
-- * callback would be found in hdev->req_skb instead of the
-+ * callback would be found in hdev->sent_cmd instead of the
- * command queue (hdev->cmd_q).
- */
-- if (skb && bt_cb(skb)->hci.req_flags & HCI_REQ_SKB) {
-- *req_complete_skb = bt_cb(skb)->hci.req_complete_skb;
-+ if (bt_cb(hdev->sent_cmd)->hci.req_flags & HCI_REQ_SKB) {
-+ *req_complete_skb = bt_cb(hdev->sent_cmd)->hci.req_complete_skb;
- return;
- }
-
-- if (skb && bt_cb(skb)->hci.req_complete) {
-- *req_complete = bt_cb(skb)->hci.req_complete;
-+ if (bt_cb(hdev->sent_cmd)->hci.req_complete) {
-+ *req_complete = bt_cb(hdev->sent_cmd)->hci.req_complete;
- return;
- }
-
-@@ -4143,11 +4128,8 @@ static void hci_send_cmd_sync(struct hci
- return;
- }
-
-- if (hci_req_status_pend(hdev) &&
-- !hci_dev_test_and_set_flag(hdev, HCI_CMD_PENDING)) {
-- kfree_skb(hdev->req_skb);
-- hdev->req_skb = skb_clone(skb, GFP_KERNEL);
-- }
-+ if (hci_req_status_pend(hdev))
-+ hci_dev_set_flag(hdev, HCI_CMD_PENDING);
-
- atomic_dec(&hdev->cmd_cnt);
- }
---- a/net/bluetooth/hci_event.c
-+++ b/net/bluetooth/hci_event.c
-@@ -4354,7 +4354,7 @@ static void hci_cmd_status_evt(struct hc
- * (since for this kind of commands there will not be a command
- * complete event).
- */
-- if (ev->status || (hdev->req_skb && !hci_skb_event(hdev->req_skb))) {
-+ if (ev->status || (hdev->sent_cmd && !hci_skb_event(hdev->sent_cmd))) {
- hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
- req_complete_skb);
- if (hci_dev_test_flag(hdev, HCI_CMD_PENDING)) {
-@@ -7171,10 +7171,10 @@ static void hci_le_meta_evt(struct hci_d
- bt_dev_dbg(hdev, "subevent 0x%2.2x", ev->subevent);
-
- /* Only match event if command OGF is for LE */
-- if (hdev->req_skb &&
-- hci_opcode_ogf(hci_skb_opcode(hdev->req_skb)) == 0x08 &&
-- hci_skb_event(hdev->req_skb) == ev->subevent) {
-- *opcode = hci_skb_opcode(hdev->req_skb);
-+ if (hdev->sent_cmd &&
-+ hci_opcode_ogf(hci_skb_opcode(hdev->sent_cmd)) == 0x08 &&
-+ hci_skb_event(hdev->sent_cmd) == ev->subevent) {
-+ *opcode = hci_skb_opcode(hdev->sent_cmd);
- hci_req_cmd_complete(hdev, *opcode, 0x00, req_complete,
- req_complete_skb);
- }
-@@ -7561,10 +7561,10 @@ void hci_event_packet(struct hci_dev *hd
- }
-
- /* Only match event if command OGF is not for LE */
-- if (hdev->req_skb &&
-- hci_opcode_ogf(hci_skb_opcode(hdev->req_skb)) != 0x08 &&
-- hci_skb_event(hdev->req_skb) == event) {
-- hci_req_cmd_complete(hdev, hci_skb_opcode(hdev->req_skb),
-+ if (hdev->sent_cmd &&
-+ hci_opcode_ogf(hci_skb_opcode(hdev->sent_cmd)) != 0x08 &&
-+ hci_skb_event(hdev->sent_cmd) == event) {
-+ hci_req_cmd_complete(hdev, hci_skb_opcode(hdev->sent_cmd),
- status, &req_complete, &req_complete_skb);
- req_evt = event;
- }
---- a/net/bluetooth/hci_sync.c
-+++ b/net/bluetooth/hci_sync.c
-@@ -31,10 +31,6 @@ static void hci_cmd_sync_complete(struct
- hdev->req_result = result;
- hdev->req_status = HCI_REQ_DONE;
-
-- /* Free the request command so it is not used as response */
-- kfree_skb(hdev->req_skb);
-- hdev->req_skb = NULL;
--
- if (skb) {
- struct sock *sk = hci_skb_sk(skb);
-
-@@ -42,7 +38,7 @@ static void hci_cmd_sync_complete(struct
- if (sk)
- sock_put(sk);
-
-- hdev->req_rsp = skb_get(skb);
-+ hdev->req_skb = skb_get(skb);
- }
-
- wake_up_interruptible(&hdev->req_wait_q);
-@@ -190,8 +186,8 @@ struct sk_buff *__hci_cmd_sync_sk(struct
-
- hdev->req_status = 0;
- hdev->req_result = 0;
-- skb = hdev->req_rsp;
-- hdev->req_rsp = NULL;
-+ skb = hdev->req_skb;
-+ hdev->req_skb = NULL;
-
- bt_dev_dbg(hdev, "end: err %d", err);
-
-@@ -4941,11 +4937,6 @@ int hci_dev_open_sync(struct hci_dev *hd
- hdev->sent_cmd = NULL;
- }
-
-- if (hdev->req_skb) {
-- kfree_skb(hdev->req_skb);
-- hdev->req_skb = NULL;
-- }
--
- clear_bit(HCI_RUNNING, &hdev->flags);
- hci_sock_dev_event(hdev, HCI_DEV_CLOSE);
-
-@@ -5107,12 +5098,6 @@ int hci_dev_close_sync(struct hci_dev *h
- hdev->sent_cmd = NULL;
- }
-
-- /* Drop last request */
-- if (hdev->req_skb) {
-- kfree_skb(hdev->req_skb);
-- hdev->req_skb = NULL;
-- }
--
- clear_bit(HCI_RUNNING, &hdev->flags);
- hci_sock_dev_event(hdev, HCI_DEV_CLOSE);
-
+++ /dev/null
-revert-bluetooth-fix-use-after-free-in-accessing-skb-after-sending-it.patch
-revert-bluetooth-hci_sync-fix-overwriting-request-callback.patch
-revert-bluetooth-af_bluetooth-fix-deadlock.patch
-revert-bluetooth-hci_core-fix-possible-buffer-overflow.patch
-revert-bluetooth-hci_conn-consolidate-code-for-aborting-connections.patch