summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2005-01-20 02:53:11 +0000
committersam <sam@FreeBSD.org>2005-01-20 02:53:11 +0000
commit2b292030fbf30c751ffc17e7e463d4a178355ec9 (patch)
tree30f8b572c3eb2050b28d9e314e3eb3e59337a8d4 /sys/net80211
parent48aecee0a9e8c0370f37f29f3a66c6ef1ac100ec (diff)
downloadFreeBSD-src-2b292030fbf30c751ffc17e7e463d4a178355ec9.zip
FreeBSD-src-2b292030fbf30c751ffc17e7e463d4a178355ec9.tar.gz
fix refcnt leak in adhoc mode: entries in the neighbor table
created due to rx'd frames had an extra reference
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_node.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c
index 39bf737..94c8ac2 100644
--- a/sys/net80211/ieee80211_node.c
+++ b/sys/net80211/ieee80211_node.c
@@ -1037,7 +1037,6 @@ ieee80211_fakeup_adhoc_node(struct ieee80211_node_table *nt,
ic->ic_newassoc(ic, ni, 1);
/* XXX not right for 802.1x/WPA */
ieee80211_node_authorize(ic, ni);
- ieee80211_ref_node(ni); /* hold reference */
}
return ni;
}
@@ -1117,9 +1116,16 @@ ieee80211_find_txnode(struct ieee80211com *ic, const u_int8_t *macaddr)
if (ni == NULL) {
if (ic->ic_opmode == IEEE80211_M_IBSS ||
- ic->ic_opmode == IEEE80211_M_AHDEMO)
+ ic->ic_opmode == IEEE80211_M_AHDEMO) {
+ /*
+ * In adhoc mode cons up a node for the destination.
+ * Note that we need an additional reference for the
+ * caller to be consistent with _ieee80211_find_node.
+ */
ni = ieee80211_fakeup_adhoc_node(nt, macaddr);
- else {
+ if (ni != NULL)
+ (void) ieee80211_ref_node(ni);
+ } else {
IEEE80211_DPRINTF(ic, IEEE80211_MSG_OUTPUT,
"[%s] no node, discard frame (%s)\n",
ether_sprintf(macaddr), __func__);
OpenPOWER on IntegriCloud