Commit 3673952c authored by Min Li's avatar Min Li Committed by Luiz Augusto von Dentz

Bluetooth: Fix potential use-after-free when clear keys

Similar to commit c5d2b6fa ("Bluetooth: Fix use-after-free in
hci_remove_ltk/hci_remove_irk"). We can not access k after kfree_rcu()
call.

Fixes: d7d41682 ("Bluetooth: Fix Suspicious RCU usage warnings")
Signed-off-by: default avatarMin Li <lm0963hack@gmail.com>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent a1f6c3ae
...@@ -1074,9 +1074,9 @@ void hci_uuids_clear(struct hci_dev *hdev) ...@@ -1074,9 +1074,9 @@ void hci_uuids_clear(struct hci_dev *hdev)
void hci_link_keys_clear(struct hci_dev *hdev) void hci_link_keys_clear(struct hci_dev *hdev)
{ {
struct link_key *key; struct link_key *key, *tmp;
list_for_each_entry(key, &hdev->link_keys, list) { list_for_each_entry_safe(key, tmp, &hdev->link_keys, list) {
list_del_rcu(&key->list); list_del_rcu(&key->list);
kfree_rcu(key, rcu); kfree_rcu(key, rcu);
} }
...@@ -1084,9 +1084,9 @@ void hci_link_keys_clear(struct hci_dev *hdev) ...@@ -1084,9 +1084,9 @@ void hci_link_keys_clear(struct hci_dev *hdev)
void hci_smp_ltks_clear(struct hci_dev *hdev) void hci_smp_ltks_clear(struct hci_dev *hdev)
{ {
struct smp_ltk *k; struct smp_ltk *k, *tmp;
list_for_each_entry(k, &hdev->long_term_keys, list) { list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
list_del_rcu(&k->list); list_del_rcu(&k->list);
kfree_rcu(k, rcu); kfree_rcu(k, rcu);
} }
...@@ -1094,9 +1094,9 @@ void hci_smp_ltks_clear(struct hci_dev *hdev) ...@@ -1094,9 +1094,9 @@ void hci_smp_ltks_clear(struct hci_dev *hdev)
void hci_smp_irks_clear(struct hci_dev *hdev) void hci_smp_irks_clear(struct hci_dev *hdev)
{ {
struct smp_irk *k; struct smp_irk *k, *tmp;
list_for_each_entry(k, &hdev->identity_resolving_keys, list) { list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) {
list_del_rcu(&k->list); list_del_rcu(&k->list);
kfree_rcu(k, rcu); kfree_rcu(k, rcu);
} }
...@@ -1104,9 +1104,9 @@ void hci_smp_irks_clear(struct hci_dev *hdev) ...@@ -1104,9 +1104,9 @@ void hci_smp_irks_clear(struct hci_dev *hdev)
void hci_blocked_keys_clear(struct hci_dev *hdev) void hci_blocked_keys_clear(struct hci_dev *hdev)
{ {
struct blocked_key *b; struct blocked_key *b, *tmp;
list_for_each_entry(b, &hdev->blocked_keys, list) { list_for_each_entry_safe(b, tmp, &hdev->blocked_keys, list) {
list_del_rcu(&b->list); list_del_rcu(&b->list);
kfree_rcu(b, rcu); kfree_rcu(b, rcu);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment