Bläddra i källkod

qcacld-3.0: Fix tdls vdev ref issue for race condition

When wpa_supplicant sent tdls mgmt frame during sta disconnecting for NUD
failure, scheduler thread clear MLO flag of vdev0, in
wlan_key_get_link_vdev, wlan_vdev_mlme_is_mlo_vdev(vdev0) return true,
in wlan_key_put_link_vdev, wlan_vdev_mlme_is_mlo_vdev(vdev0) return false,
WLAN_OSIF_TDLS_ID vdev ref count is released in both
wlan_key_get_link_vdev and wlan_key_put_link_vdev, while WLAN_MLO_MGR_ID
vdev ref count isn't released, assert will happen.

To fix it, add check in os_if, if vdev not up, reject tdls frame to
avoid such race condition issue.

Change-Id: I90e60c95888cc63e57d0bd0b75c570d8d677cbaa
CRs-Fixed: 3572133
Jianmin Zhu 1 år sedan
förälder
incheckning
263d0d2296
1 ändrade filer med 7 tillägg och 0 borttagningar
  1. 7 0
      os_if/tdls/src/wlan_cfg80211_tdls.c

+ 7 - 0
os_if/tdls/src/wlan_cfg80211_tdls.c

@@ -1225,6 +1225,13 @@ wlan_cfg80211_tdls_mgmt_mlo(struct hdd_adapter *adapter, const uint8_t *peer,
 	if (!vdev)
 		return -EINVAL;
 
+	/* STA should be connected before sending any TDLS frame */
+	if (wlan_vdev_is_up(vdev) != QDF_STATUS_SUCCESS) {
+		osif_err("STA is not connected");
+		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_TDLS_ID);
+		return -EAGAIN;
+	}
+
 	is_mlo_vdev = wlan_vdev_mlme_is_mlo_vdev(vdev);
 	if (is_mlo_vdev) {
 		tdls_link_vdev =