Skip to content

Commit

Permalink
Bluetooth: msft: fix slab-use-after-free in msft_do_close()
Browse files Browse the repository at this point in the history
[ Upstream commit 10f9f42 ]

Tying the msft->data lifetime to hdev by freeing it in
hci_release_dev() to fix the following case:

[use]
msft_do_close()
  msft = hdev->msft_data;
  if (!msft)                      ...(1) <- passed.
    return;
  mutex_lock(&msft->filter_lock); ...(4) <- used after freed.

[free]
msft_unregister()
  msft = hdev->msft_data;
  hdev->msft_data = NULL;         ...(2)
  kfree(msft);                    ...(3) <- msft is freed.

==================================================================
BUG: KASAN: slab-use-after-free in __mutex_lock_common
kernel/locking/mutex.c:587 [inline]
BUG: KASAN: slab-use-after-free in __mutex_lock+0x8f/0xc30
kernel/locking/mutex.c:752
Read of size 8 at addr ffff888106cbbca8 by task kworker/u5:2/309

Fixes: bf6a4e3 ("Bluetooth: disable advertisement filters during suspend")
Signed-off-by: Sungwoo Kim <iam@sung-woo.kim>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
swkim101 authored and gregkh committed May 17, 2024
1 parent bfab2c1 commit e3880b5
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 5 deletions.
3 changes: 1 addition & 2 deletions net/bluetooth/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2733,8 +2733,6 @@ void hci_unregister_dev(struct hci_dev *hdev)

hci_unregister_suspend_notifier(hdev);

msft_unregister(hdev);

hci_dev_do_close(hdev);

if (!test_bit(HCI_INIT, &hdev->flags) &&
Expand Down Expand Up @@ -2788,6 +2786,7 @@ void hci_release_dev(struct hci_dev *hdev)
hci_discovery_filter_clear(hdev);
hci_blocked_keys_clear(hdev);
hci_codec_list_clear(&hdev->local_codecs);
msft_release(hdev);
hci_dev_unlock(hdev);

ida_simple_remove(&hci_index_ida, hdev->id);
Expand Down
2 changes: 1 addition & 1 deletion net/bluetooth/msft.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ void msft_register(struct hci_dev *hdev)
hdev->msft_data = msft;
}

void msft_unregister(struct hci_dev *hdev)
void msft_release(struct hci_dev *hdev)
{
struct msft_data *msft = hdev->msft_data;

Expand Down
4 changes: 2 additions & 2 deletions net/bluetooth/msft.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

bool msft_monitor_supported(struct hci_dev *hdev);
void msft_register(struct hci_dev *hdev);
void msft_unregister(struct hci_dev *hdev);
void msft_release(struct hci_dev *hdev);
void msft_do_open(struct hci_dev *hdev);
void msft_do_close(struct hci_dev *hdev);
void msft_vendor_evt(struct hci_dev *hdev, void *data, struct sk_buff *skb);
Expand All @@ -35,7 +35,7 @@ static inline bool msft_monitor_supported(struct hci_dev *hdev)
}

static inline void msft_register(struct hci_dev *hdev) {}
static inline void msft_unregister(struct hci_dev *hdev) {}
static inline void msft_release(struct hci_dev *hdev) {}
static inline void msft_do_open(struct hci_dev *hdev) {}
static inline void msft_do_close(struct hci_dev *hdev) {}
static inline void msft_vendor_evt(struct hci_dev *hdev, void *data,
Expand Down

0 comments on commit e3880b5

Please sign in to comment.