diff options
Diffstat (limited to 'drivers/net/wireless/b43/xmit.c')
-rw-r--r-- | drivers/net/wireless/b43/xmit.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 3fc53e8b4416..7caa26eb4105 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -178,12 +178,12 @@ static u8 b43_calc_fallback_rate(u8 bitrate) | |||
178 | } | 178 | } |
179 | 179 | ||
180 | /* Generate a TX data header. */ | 180 | /* Generate a TX data header. */ |
181 | void b43_generate_txhdr(struct b43_wldev *dev, | 181 | int b43_generate_txhdr(struct b43_wldev *dev, |
182 | u8 *_txhdr, | 182 | u8 *_txhdr, |
183 | const unsigned char *fragment_data, | 183 | const unsigned char *fragment_data, |
184 | unsigned int fragment_len, | 184 | unsigned int fragment_len, |
185 | const struct ieee80211_tx_control *txctl, | 185 | const struct ieee80211_tx_control *txctl, |
186 | u16 cookie) | 186 | u16 cookie) |
187 | { | 187 | { |
188 | struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr; | 188 | struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr; |
189 | const struct b43_phy *phy = &dev->phy; | 189 | const struct b43_phy *phy = &dev->phy; |
@@ -237,7 +237,15 @@ void b43_generate_txhdr(struct b43_wldev *dev, | |||
237 | 237 | ||
238 | B43_WARN_ON(key_idx >= dev->max_nr_keys); | 238 | B43_WARN_ON(key_idx >= dev->max_nr_keys); |
239 | key = &(dev->key[key_idx]); | 239 | key = &(dev->key[key_idx]); |
240 | B43_WARN_ON(!key->keyconf); | 240 | |
241 | if (unlikely(!key->keyconf)) { | ||
242 | /* This key is invalid. This might only happen | ||
243 | * in a short timeframe after machine resume before | ||
244 | * we were able to reconfigure keys. | ||
245 | * Drop this packet completely. Do not transmit it | ||
246 | * unencrypted to avoid leaking information. */ | ||
247 | return -ENOKEY; | ||
248 | } | ||
241 | 249 | ||
242 | /* Hardware appends ICV. */ | 250 | /* Hardware appends ICV. */ |
243 | plcp_fragment_len += txctl->icv_len; | 251 | plcp_fragment_len += txctl->icv_len; |
@@ -408,6 +416,7 @@ void b43_generate_txhdr(struct b43_wldev *dev, | |||
408 | txhdr->phy_ctl = cpu_to_le16(phy_ctl); | 416 | txhdr->phy_ctl = cpu_to_le16(phy_ctl); |
409 | txhdr->extra_ft = extra_ft; | 417 | txhdr->extra_ft = extra_ft; |
410 | 418 | ||
419 | return 0; | ||
411 | } | 420 | } |
412 | 421 | ||
413 | static s8 b43_rssi_postprocess(struct b43_wldev *dev, | 422 | static s8 b43_rssi_postprocess(struct b43_wldev *dev, |