ath10k: add some sanity checks to peer_map_event() functions
authorDan Carpenter <dan.carpenter@oracle.com>
Mon, 11 Apr 2016 08:15:20 +0000 (11:15 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 19 Apr 2016 15:10:46 +0000 (18:10 +0300)
Smatch complains that since "ev->peer_id" comes from skb->data that
means we can't trust it and have to do a bounds check on it to prevent
an array overflow.

Fixes: 6942726f7f7b ('ath10k: add fast peer_map lookup')
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/txrx.c

index 8c7086989a71cb4614e1e759f3e9e26a2bf5fac7..576e7c42ed657549d90dbd31ea74f3fbac5ee47e 100644 (file)
@@ -190,6 +190,13 @@ void ath10k_peer_map_event(struct ath10k_htt *htt,
        struct ath10k *ar = htt->ar;
        struct ath10k_peer *peer;
 
+       if (ev->peer_id >= ATH10K_MAX_NUM_PEER_IDS) {
+               ath10k_warn(ar,
+                           "received htt peer map event with idx out of bounds: %hu\n",
+                           ev->peer_id);
+               return;
+       }
+
        spin_lock_bh(&ar->data_lock);
        peer = ath10k_peer_find(ar, ev->vdev_id, ev->addr);
        if (!peer) {
@@ -218,6 +225,13 @@ void ath10k_peer_unmap_event(struct ath10k_htt *htt,
        struct ath10k *ar = htt->ar;
        struct ath10k_peer *peer;
 
+       if (ev->peer_id >= ATH10K_MAX_NUM_PEER_IDS) {
+               ath10k_warn(ar,
+                           "received htt peer unmap event with idx out of bounds: %hu\n",
+                           ev->peer_id);
+               return;
+       }
+
        spin_lock_bh(&ar->data_lock);
        peer = ath10k_peer_find_by_id(ar, ev->peer_id);
        if (!peer) {