diff options
author | Felix Fietkau <nbd@openwrt.org> | 2008-09-26 20:09:17 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2008-09-26 20:09:17 +0000 |
commit | c109d5d0913de0ff9d48db640c436d925f43a5ae (patch) | |
tree | 82811e2a1b9c68e3043fb489acc9c07ae610a2ef /package/madwifi/patches/380-noderef_fix.patch | |
parent | 821170133fc75f42c73b4d11761d798eae7e4733 (diff) | |
download | mtk-20170518-c109d5d0913de0ff9d48db640c436d925f43a5ae.zip mtk-20170518-c109d5d0913de0ff9d48db640c436d925f43a5ae.tar.gz mtk-20170518-c109d5d0913de0ff9d48db640c436d925f43a5ae.tar.bz2 |
madwifi: fix some really evil noderef issues (fixes #3999)
SVN-Revision: 12719
Diffstat (limited to 'package/madwifi/patches/380-noderef_fix.patch')
-rw-r--r-- | package/madwifi/patches/380-noderef_fix.patch | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/package/madwifi/patches/380-noderef_fix.patch b/package/madwifi/patches/380-noderef_fix.patch new file mode 100644 index 0000000..e3a6b46 --- /dev/null +++ b/package/madwifi/patches/380-noderef_fix.patch @@ -0,0 +1,58 @@ +--- a/net80211/ieee80211_node.c ++++ b/net80211/ieee80211_node.c +@@ -316,7 +316,7 @@ + */ + ni = ieee80211_find_node(&ic->ic_sta, vap->iv_myaddr); + if (ni == NULL) { +- ni = ieee80211_alloc_node_table(vap, vap->iv_myaddr); ++ ni = ieee80211_alloc_node(vap, vap->iv_myaddr); + IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, + "%s: ni:%p allocated for " MAC_FMT "\n", + __func__, ni, MAC_ADDR(vap->iv_myaddr)); +@@ -421,14 +421,14 @@ + /* XXX multi-bss wrong */ + ieee80211_reset_erp(ic, ic->ic_curmode); + +- ni = ieee80211_alloc_node_table(vap, vap->iv_myaddr); ++ ni = ieee80211_alloc_node(vap, vap->iv_myaddr); + IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, + "%s: ni:%p allocated for " MAC_FMT "\n", + __func__, ni, MAC_ADDR(vap->iv_myaddr)); + KASSERT(ni != NULL, ("unable to setup inital BSS node")); + + vap->iv_bss = PASS_NODE(ni); +- KASSERT((atomic_read(&vap->iv_bss->ni_refcnt) == 2), ++ KASSERT((atomic_read(&vap->iv_bss->ni_refcnt) == 1), + ("wrong refcount for new node.")); + + if (obss != NULL) { +@@ -630,6 +630,7 @@ + ieee80211_fix_rate(selbs, IEEE80211_F_DODEL); + } + ++ IEEE80211_VAPS_LOCK_BH(ic); + /* + * Committed to selbs, setup state. + */ +@@ -642,8 +643,9 @@ + (vap->iv_state == IEEE80211_S_RUN) && bssid_equal(obss, selbs)); */ + vap->iv_bss = selbs; + IEEE80211_ADDR_COPY(vap->iv_bssid, selbs->ni_bssid); +- if (obss != NULL) ++ if ((obss != NULL) && (obss != selbs)) + ieee80211_unref_node(&obss); ++ IEEE80211_VAPS_UNLOCK_BH(ic); + ic->ic_bsschan = selbs->ni_chan; + ic->ic_curchan = ic->ic_bsschan; + ic->ic_curmode = ieee80211_chan2mode(ic->ic_curchan); +--- a/net80211/ieee80211_input.c ++++ b/net80211/ieee80211_input.c +@@ -3110,7 +3110,7 @@ + u_int8_t qosinfo; + + if (ni_or_null == NULL) +- ni = vap->iv_bss; ++ ni = ieee80211_ref_node(vap->iv_bss); + + wh = (struct ieee80211_frame *) skb->data; + frm = (u_int8_t *)&wh[1]; |