]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
cfg80211: fix incorrect assumption on last_request for 11d
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Sat, 28 Mar 2009 01:45:08 +0000 (01:45 +0000)
committerChris Wright <chrisw@sous-sol.org>
Thu, 2 Apr 2009 20:55:19 +0000 (13:55 -0700)
upstream commit: cc0b6fe88e99096868bdbacbf486c97299533b5a

The incorrect assumption is the last regulatory request
(last_request) is always a country IE when processing
country IEs. Although this is true 99% of the time the
first time this happens this could not be true.

This fixes an oops in the branch check for the last_request
when accessing drv_last_ie. The access was done under the
assumption the struct won't be null.

Note to stable: to port to 29 replace as follows, only 29 has
country IE code:

s|NL80211_REGDOM_SET_BY_COUNTRY_IE|REGDOM_SET_BY_COUNTRY_IE

Cc: stable@kernel.org
Reported-by: Quentin Armitage <Quentin@armitage.org.uk>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
[chrisw: backport to 2.6.29]
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
net/wireless/reg.c

index 0a08e74c98b231c011ba3eee7c45844b422b74c3..4f9ff2a6a297a78ed55072425254e14d698a9b10 100644 (file)
@@ -1083,6 +1083,8 @@ EXPORT_SYMBOL(regulatory_hint);
 static bool reg_same_country_ie_hint(struct wiphy *wiphy,
                        u32 country_ie_checksum)
 {
+       if (unlikely(last_request->initiator != REGDOM_SET_BY_COUNTRY_IE))
+               return false;
        if (!last_request->wiphy)
                return false;
        if (likely(last_request->wiphy != wiphy))
@@ -1133,7 +1135,9 @@ void regulatory_hint_11d(struct wiphy *wiphy,
        /* We will run this for *every* beacon processed for the BSSID, so
         * we optimize an early check to exit out early if we don't have to
         * do anything */
-       if (likely(last_request->wiphy)) {
+       if (likely(last_request->initiator ==
+           REGDOM_SET_BY_COUNTRY_IE &&
+           likely(last_request->wiphy))) {
                struct cfg80211_registered_device *drv_last_ie;
 
                drv_last_ie = wiphy_to_dev(last_request->wiphy);