]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commit
cfg80211: fix race in netlink owner interface destruction
authorJohannes Berg <johannes.berg@intel.com>
Tue, 1 Feb 2022 13:09:51 +0000 (14:09 +0100)
committerPaolo Pisati <paolo.pisati@canonical.com>
Mon, 7 Mar 2022 10:44:08 +0000 (11:44 +0100)
commitb47cac1efbdf109d6a8299118b64cd0e94b82dbf
treea5cdeca7e90b22e587edcf5258cc87d7fe14fd7a
parentd9fb33ca4194dcb4fd799bab98346b90ee3198a1
cfg80211: fix race in netlink owner interface destruction

BugLink: https://bugs.launchpad.net/bugs/1963890
commit f0a6fd1527067da537e9c48390237488719948ed upstream.

My previous fix here to fix the deadlock left a race where
the exact same deadlock (see the original commit referenced
below) can still happen if cfg80211_destroy_ifaces() already
runs while nl80211_netlink_notify() is still marking some
interfaces as nl_owner_dead.

The race happens because we have two loops here - first we
dev_close() all the netdevs, and then we destroy them. If we
also have two netdevs (first one need only be a wdev though)
then we can find one during the first iteration, close it,
and go to the second iteration -- but then find two, and try
to destroy also the one we didn't close yet.

Fix this by only iterating once.

Reported-by: Toke Høiland-Jørgensen <toke@redhat.com>
Fixes: ea6b2098dd02 ("cfg80211: fix locking in netlink owner interface destruction")
Tested-by: Toke Høiland-Jørgensen <toke@redhat.com>
Link: https://lore.kernel.org/r/20220201130951.22093-1-johannes@sipsolutions.net
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
net/wireless/core.c