diff options
author | sam <sam@FreeBSD.org> | 2005-01-20 02:53:11 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2005-01-20 02:53:11 +0000 |
commit | 2b292030fbf30c751ffc17e7e463d4a178355ec9 (patch) | |
tree | 30f8b572c3eb2050b28d9e314e3eb3e59337a8d4 /sys/net80211/ieee80211_node.c | |
parent | 48aecee0a9e8c0370f37f29f3a66c6ef1ac100ec (diff) | |
download | FreeBSD-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/ieee80211_node.c')
-rw-r--r-- | sys/net80211/ieee80211_node.c | 12 |
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__); |