mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
Bluetooth: hci_core: Initialize IRK before publication
hci_add_irk() initializes the identity address and address type of a newly
allocated IRK, publishes it on hdev->identity_resolving_keys, and only then
initializes its value and RPA. RCU readers such as hci_find_irk_by_rpa()
and the debugfs identity_resolving_keys_show() can traverse the new entry
during that window and see a zero or partially initialized IRK.
The race is reachable by racing an IRK addition with another CPU resolving
or dumping IRKs. In particular, userspace can issue MGMT_OP_LOAD_IRKS
while another process reads the corresponding debugfs file or triggers RPA
resolution.
Initialize the IRK value and RPA before publishing a newly allocated IRK.
Existing IRKs remain published and continue to be updated in place.
Found during a static-analysis-assisted audit: candidate sites were
surfaced by a Coccinelle rule, and the reader/writer paths were
confirmed by LLM-assisted (GLM-5.3) code inspection. The issue was
not observed at runtime; it is identified by code inspection only.
Fixes: adae20cb2d ("Bluetooth: Convert IRK list to RCU")
Assisted-by: GLM-5.3 coccinelle
Signed-off-by: Binbin Deng <18983559317@163.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
fb1baa000d
commit
f0cf5a24ce
|
|
@ -1315,9 +1315,10 @@ struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
|||
struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 addr_type, u8 val[16], bdaddr_t *rpa)
|
||||
{
|
||||
struct smp_irk *irk;
|
||||
struct smp_irk *irk, *old_irk;
|
||||
|
||||
irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
|
||||
old_irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
|
||||
irk = old_irk;
|
||||
if (!irk) {
|
||||
irk = kzalloc_obj(*irk);
|
||||
if (!irk)
|
||||
|
|
@ -1326,12 +1327,14 @@ struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
|||
bacpy(&irk->bdaddr, bdaddr);
|
||||
irk->addr_type = addr_type;
|
||||
|
||||
list_add_rcu(&irk->list, &hdev->identity_resolving_keys);
|
||||
}
|
||||
|
||||
memcpy(irk->val, val, 16);
|
||||
bacpy(&irk->rpa, rpa);
|
||||
|
||||
if (!old_irk)
|
||||
list_add_rcu(&irk->list, &hdev->identity_resolving_keys);
|
||||
|
||||
return irk;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user