]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtl818x: Remove SKB list assumptions.
authorDavid S. Miller <davem@davemloft.net>
Wed, 22 Aug 2018 23:50:17 +0000 (16:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 10 Sep 2018 17:06:54 +0000 (10:06 -0700)
Eliminate the assumption that SKBs and SKB list heads can
be cast to eachother in SKB list handling code.

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c

index 9a1d15b3ce4535540184d34a5600be131ba329dd..cec37787ecf88eac9977865538a67f23a986c8b1 100644 (file)
@@ -499,7 +499,7 @@ static void rtl8187b_status_cb(struct urb *urb)
        if (cmd_type == 1) {
                unsigned int pkt_rc, seq_no;
                bool tok;
-               struct sk_buff *skb;
+               struct sk_buff *skb, *iter;
                struct ieee80211_hdr *ieee80211hdr;
                unsigned long flags;
 
@@ -508,8 +508,9 @@ static void rtl8187b_status_cb(struct urb *urb)
                seq_no = (val >> 16) & 0xFFF;
 
                spin_lock_irqsave(&priv->b_tx_status.queue.lock, flags);
-               skb_queue_reverse_walk(&priv->b_tx_status.queue, skb) {
-                       ieee80211hdr = (struct ieee80211_hdr *)skb->data;
+               skb = NULL;
+               skb_queue_reverse_walk(&priv->b_tx_status.queue, iter) {
+                       ieee80211hdr = (struct ieee80211_hdr *)iter->data;
 
                        /*
                         * While testing, it was discovered that the seq_no
@@ -522,10 +523,12 @@ static void rtl8187b_status_cb(struct urb *urb)
                         * it's unlikely we wrongly ack some sent data
                         */
                        if ((le16_to_cpu(ieee80211hdr->seq_ctrl)
-                           & 0xFFF) == seq_no)
+                            & 0xFFF) == seq_no) {
+                               skb = iter;
                                break;
+                       }
                }
-               if (skb != (struct sk_buff *) &priv->b_tx_status.queue) {
+               if (skb) {
                        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 
                        __skb_unlink(skb, &priv->b_tx_status.queue);