--- x/net/mac80211/sta_info.c +++ y/net/mac80211/sta_info.c @@ -937,7 +937,13 @@ int sta_info_insert_rcu(struct sta_info mutex_lock(&local->sta_mtx); - err = sta_info_insert_check(sta); + err = 0; + if (ether_addr_equal(sta->sta.addr, sta->sdata->vif.addr) || + !is_valid_ether_addr(sta->sta.addr)) + err = -EINVAL; + + if (!err) + err = sta_info_insert_check(sta); if (err) { sta_info_free(local, sta); mutex_unlock(&local->sta_mtx); --- x/net/mac80211/mlme.c +++ y/net/mac80211/mlme.c @@ -7062,8 +7062,10 @@ static int ieee80211_prep_connection(str return 0; out_err: + mutex_lock(&sdata->local->mtx); ieee80211_link_release_channel(&sdata->deflink); ieee80211_vif_set_links(sdata, 0, 0); + mutex_unlock(&sdata->local->mtx); return err; }