Search Linux Wireless

Re: Lots of confusion on bss refcounting.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2013-06-17 at 11:49 -0700, Ben Greear wrote:

> We create an assoc_data, assign a bss pointer in ieee80211_mgd_assoc,
> but do not claim a reference.

Heh, yeah, I was actually looking at this code too but didn't have time
today to finish my thoughts ...

> Later, when deleting the assoc_data, the ref is not freed either,
> except in one error path where it is explicitly freed:
> 
> 		if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) {
> 			/* oops -- internal error -- send timeout for now */
> 			ieee80211_destroy_assoc_data(sdata, false);
> 			cfg80211_put_bss(sdata->local->hw.wiphy, *bss);
> 			return RX_MGMT_CFG80211_ASSOC_TIMEOUT;
> 		}
> 
> This seems ripe for bugs, if not already buggy.
> 
> Maybe we should be more explicit about always grabbing a ref when
> we take a reference to the pointer, and always put it when we
> destroy the pointer?

I think the reference is actually given to mac80211 by cfg80211 in
cfg80211_mlme_assoc(), so we shouldn't need to grab a reference?
Although I'm certainly willing to change this and make cfg80211 always
put the reference after calling rdev_assoc() so that the driver/mac80211
would be responsible for obtaining its own if it needs to hang on to the
struct.

This does seem broken though.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux