Commit e9da6df7 authored by Johannes Berg's avatar Johannes Berg
Browse files

wifi: cfg80211: hold wiphy lock in auto-disconnect



Most code paths in cfg80211 already hold the wiphy lock,
mostly by virtue of being called from nl80211, so make
the auto-disconnect worker also hold it, aligning the
locking promises between different parts of cfg80211.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 10f5ae21
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -1178,10 +1178,6 @@ static void _cfg80211_unregister_wdev(struct wireless_dev *wdev,
	kfree_sensitive(wdev->wext.keys);
	wdev->wext.keys = NULL;
#endif
	/* only initialized if we have a netdev */
	if (wdev->netdev)
		flush_work(&wdev->disconnect_wk);

	cfg80211_cqm_config_free(wdev);

	/*
@@ -1455,6 +1451,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
		cfg80211_leave(rdev, wdev);
		cfg80211_remove_links(wdev);
		wiphy_unlock(&rdev->wiphy);
		/* since we just did cfg80211_leave() nothing to do there */
		cancel_work_sync(&wdev->disconnect_wk);
		break;
	case NETDEV_DOWN:
		wiphy_lock(&rdev->wiphy);
+3 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
 * (for nl80211's connect() and wext)
 *
 * Copyright 2009	Johannes Berg <johannes@sipsolutions.net>
 * Copyright (C) 2009, 2020, 2022 Intel Corporation. All rights reserved.
 * Copyright (C) 2009, 2020, 2022-2023 Intel Corporation. All rights reserved.
 * Copyright 2017	Intel Deutschland GmbH
 */

@@ -1569,6 +1569,7 @@ void cfg80211_autodisconnect_wk(struct work_struct *work)
		container_of(work, struct wireless_dev, disconnect_wk);
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);

	wiphy_lock(wdev->wiphy);
	wdev_lock(wdev);

	if (wdev->conn_owner_nlportid) {
@@ -1607,4 +1608,5 @@ void cfg80211_autodisconnect_wk(struct work_struct *work)
	}

	wdev_unlock(wdev);
	wiphy_unlock(wdev->wiphy);
}