aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorReinette Chatre <reinette.chatre@intel.com>2009-08-13 16:30:50 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-20 11:33:09 -0400
commite6a6cf4c42e0dc3541a63b5f0f88299f982d6704 (patch)
tree574aabd9f6e94079697da91b1ad9c8bad865f0c6 /drivers/net/wireless/iwlwifi
parenta8b875e7dc80ff442698d8cf4f45ccce400a6a66 (diff)
iwlwifi: prevent read outside array bounds
With EDCA and HCCA we have 16 potential tid values. This is accommodated by mac80211, but iwlwifi only supports EDCA. With this implementation it is thus possible for mac80211 to request a tid that will cause iwlwifi to read outside array bounds. A similar problem exists if traffic is received in an unsupported category. We add error checking to catch these situations. Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rs.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-tx.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c2
3 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index 21331552ff2..1bd7cd4dd80 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -332,6 +332,9 @@ static u8 rs_tl_add_packet(struct iwl_lq_sta *lq_data,
332 } else 332 } else
333 return MAX_TID_COUNT; 333 return MAX_TID_COUNT;
334 334
335 if (unlikely(tid >= TID_MAX_LOAD_COUNT))
336 return MAX_TID_COUNT;
337
335 tl = &lq_data->load[tid]; 338 tl = &lq_data->load[tid];
336 339
337 curr_time -= curr_time % TID_ROUND_VALUE; 340 curr_time -= curr_time % TID_ROUND_VALUE;
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
index 9b76bd41f21..7686fc72eb8 100644
--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
@@ -745,6 +745,8 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
745 if (ieee80211_is_data_qos(fc)) { 745 if (ieee80211_is_data_qos(fc)) {
746 qc = ieee80211_get_qos_ctl(hdr); 746 qc = ieee80211_get_qos_ctl(hdr);
747 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK; 747 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
748 if (unlikely(tid >= MAX_TID_COUNT))
749 goto drop_unlock;
748 seq_number = priv->stations[sta_id].tid[tid].seq_number; 750 seq_number = priv->stations[sta_id].tid[tid].seq_number;
749 seq_number &= IEEE80211_SCTL_SEQ; 751 seq_number &= IEEE80211_SCTL_SEQ;
750 hdr->seq_ctrl = hdr->seq_ctrl & 752 hdr->seq_ctrl = hdr->seq_ctrl &
@@ -1238,6 +1240,9 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid)
1238 return -EINVAL; 1240 return -EINVAL;
1239 } 1241 }
1240 1242
1243 if (unlikely(tid >= MAX_TID_COUNT))
1244 return -EINVAL;
1245
1241 if (likely(tid < ARRAY_SIZE(default_tid_to_tx_fifo))) 1246 if (likely(tid < ARRAY_SIZE(default_tid_to_tx_fifo)))
1242 tx_fifo_id = default_tid_to_tx_fifo[tid]; 1247 tx_fifo_id = default_tid_to_tx_fifo[tid];
1243 else 1248 else
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index e617411d0c5..f339c5bd1fd 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -544,6 +544,8 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
544 if (ieee80211_is_data_qos(fc)) { 544 if (ieee80211_is_data_qos(fc)) {
545 qc = ieee80211_get_qos_ctl(hdr); 545 qc = ieee80211_get_qos_ctl(hdr);
546 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK; 546 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
547 if (unlikely(tid >= MAX_TID_COUNT))
548 goto drop;
547 seq_number = priv->stations[sta_id].tid[tid].seq_number & 549 seq_number = priv->stations[sta_id].tid[tid].seq_number &
548 IEEE80211_SCTL_SEQ; 550 IEEE80211_SCTL_SEQ;
549 hdr->seq_ctrl = cpu_to_le16(seq_number) | 551 hdr->seq_ctrl = cpu_to_le16(seq_number) |