Browse Source

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 years ago
parent
commit
c877314ca8
1 changed files with 9 additions and 0 deletions
  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;
 		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_peer_lock_destroy(ml_peer);
 	mlo_ap_ml_peerid_free(ml_peer->mlo_peer_id);
 	mlo_ap_ml_peerid_free(ml_peer->mlo_peer_id);
 	mlo_peer_free_aid(ml_dev, ml_peer);
 	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,
 			ml_dev->mld_id,
 			QDF_MAC_ADDR_REF
 			QDF_MAC_ADDR_REF
 			(ml_peer->peer_mld_addr.bytes));
 			(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_peer_free(ml_peer);
 		mlo_dev_release_link_vdevs(link_vdevs);
 		mlo_dev_release_link_vdevs(link_vdevs);
 		return status;
 		return status;