cfg80211: Fix array-bounds warning in fragment copy
authorMatthias Kaehlcke <mka@chromium.org>
Thu, 13 Apr 2017 17:05:04 +0000 (10:05 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Apr 2017 09:02:18 +0000 (11:02 +0200)
__ieee80211_amsdu_copy_frag intentionally initializes a pointer to
array[-1] to increment it later to valid values. clang rightfully
generates an array-bounds warning on the initialization statement.

Initialize the pointer to array[0] and change the algorithm from
increment before to increment after consume.

Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/util.c

index 88f3a11dbcd334495087c312ed81cc0eac0b85b9..a46bc42d0910e5f86b68e70b39ff67a0581f929a 100644 (file)
@@ -659,7 +659,7 @@ __ieee80211_amsdu_copy_frag(struct sk_buff *skb, struct sk_buff *frame,
                            int offset, int len)
 {
        struct skb_shared_info *sh = skb_shinfo(skb);
                            int offset, int len)
 {
        struct skb_shared_info *sh = skb_shinfo(skb);
-       const skb_frag_t *frag = &sh->frags[-1];
+       const skb_frag_t *frag = &sh->frags[0];
        struct page *frag_page;
        void *frag_ptr;
        int frag_len, frag_size;
        struct page *frag_page;
        void *frag_ptr;
        int frag_len, frag_size;
@@ -672,10 +672,10 @@ __ieee80211_amsdu_copy_frag(struct sk_buff *skb, struct sk_buff *frame,
 
        while (offset >= frag_size) {
                offset -= frag_size;
 
        while (offset >= frag_size) {
                offset -= frag_size;
-               frag++;
                frag_page = skb_frag_page(frag);
                frag_ptr = skb_frag_address(frag);
                frag_size = skb_frag_size(frag);
                frag_page = skb_frag_page(frag);
                frag_ptr = skb_frag_address(frag);
                frag_size = skb_frag_size(frag);
+               frag++;
        }
 
        frag_ptr += offset;
        }
 
        frag_ptr += offset;
@@ -687,12 +687,12 @@ __ieee80211_amsdu_copy_frag(struct sk_buff *skb, struct sk_buff *frame,
        len -= cur_len;
 
        while (len > 0) {
        len -= cur_len;
 
        while (len > 0) {
-               frag++;
                frag_len = skb_frag_size(frag);
                cur_len = min(len, frag_len);
                __frame_add_frag(frame, skb_frag_page(frag),
                                 skb_frag_address(frag), cur_len, frag_len);
                len -= cur_len;
                frag_len = skb_frag_size(frag);
                cur_len = min(len, frag_len);
                __frame_add_frag(frame, skb_frag_page(frag),
                                 skb_frag_address(frag), cur_len, frag_len);
                len -= cur_len;
+               frag++;
        }
 }
 
        }
 }