I'm seeing on messages like:

Data modified on freelist: word 5 of object 0xe02ac000 size 0xffc previous type 
devbuf (0xdeadbeed != 0xdeadbeef

on my access point with athn(4).  I tracked this down to a reference
count issue in ieee80211_ioctl(); word 5 is exactly where ni_refcnt
happens to be in struct ieee80211_node, and 0xdeadbeed is exactl what
you get if you decrease it after you've freed.  verified this by
adding some debug code to ieee80211_release_node().

Calling ieee80211_release_node() at that spot in ieee80211_ioctl()
doesn't make sense, since we don't hold a reference to the node.  My
guess is that ieee80211_node_leave() is the proper function to call
here.  This seems to fix the issue.

ok?


Index: ieee80211_ioctl.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.33
diff -u -p -r1.33 ieee80211_ioctl.c
--- ieee80211_ioctl.c   12 Sep 2009 19:37:27 -0000      1.33
+++ ieee80211_ioctl.c   4 Sep 2010 19:09:25 -0000
@@ -701,7 +701,7 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
                                    IEEE80211_FC0_SUBTYPE_DEAUTH,
                                    IEEE80211_REASON_AUTH_LEAVE);
 
-                       ieee80211_release_node(ic, ni);
+                       ieee80211_node_leave(ic, ni);
                }
                break;
        case SIOCG80211ALLNODES:

Reply via email to