Răsfoiți Sursa

qcacmn: Detach ml peer before free

In special case, link peer is failed to attach, then mlo peer is deleted
without detaching from ml peer list. When access peer list, assert will
happen for use after free.

Change-Id: Ic7a58fa0708ae6b920a69100e798c0aa8db7fe0d
CRs-Fixed: 3319376
Jianmin Zhu 2 ani în urmă
părinte
comite
c877314ca8
1 a modificat fișierele cu 9 adăugiri și 0 ștergeri
  1. 9 0
      umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

+ 9 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -504,6 +504,8 @@ static void mlo_peer_free(struct wlan_mlo_peer_context *ml_peer)
 		return;
 	}
 
+	mlo_debug("ML Peer " QDF_MAC_ADDR_FMT " is freed",
+		  QDF_MAC_ADDR_REF(ml_peer->peer_mld_addr.bytes));
 	mlo_peer_lock_destroy(ml_peer);
 	mlo_ap_ml_peerid_free(ml_peer->mlo_peer_id);
 	mlo_peer_free_aid(ml_dev, ml_peer);
@@ -929,6 +931,13 @@ QDF_STATUS wlan_mlo_peer_create(struct wlan_objmgr_vdev *vdev,
 			ml_dev->mld_id,
 			QDF_MAC_ADDR_REF
 			(ml_peer->peer_mld_addr.bytes));
+		/* If there is another link peer attached for this ML peer,
+		 * ml peer can't be detached and freed.
+		 */
+		if (is_ml_peer_attached && ml_peer->link_peer_cnt)
+			return status;
+		if (is_ml_peer_attached)
+			mlo_dev_mlpeer_detach(ml_dev, ml_peer);
 		mlo_peer_free(ml_peer);
 		mlo_dev_release_link_vdevs(link_vdevs);
 		return status;