mirror of
https://github.com/torvalds/linux.git
synced 2026-10-08 03:26:02 +02:00
hwsim_update_pib() does an unserialized read-swap-free of phy->pib:
pib_old = rtnl_dereference(phy->pib);
...
rcu_assign_pointer(phy->pib, pib);
kfree_rcu(pib_old, rcu);
It assumes the RTNL is held, but ->set_channel is not always called
under it: the mac802154 scan worker changes channels via
drv_set_channel() without the RTNL. Such an update can race an
RTNL-held one on the same phy; both read the same pib_old and both
kfree_rcu() it, double-freeing the object. With SLUB percpu sheaves
batching kfree_rcu(), this surfaces as a KASAN invalid-free in
rcu_free_sheaf().
struct hwsim_phy has no lock for pib. Add one and make the swap atomic
with rcu_replace_pointer() under it, dropping the misleading
rtnl_dereference().
Reported-by: syzbot+60332fd095f8bb2946ad@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=60332fd095f8bb2946ad
Fixes:
|
||
|---|---|---|
| .. | ||
| adf7242.c | ||
| at86rf230.c | ||
| at86rf230.h | ||
| atusb.c | ||
| atusb.h | ||
| ca8210.c | ||
| cc2520.c | ||
| fakelb.c | ||
| Kconfig | ||
| mac802154_hwsim.c | ||
| mac802154_hwsim.h | ||
| Makefile | ||
| mcr20a.c | ||
| mcr20a.h | ||
| mrf24j40.c | ||