net: mac80211: use skb_list_walk_safe helper for gso segments
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 13 Jan 2020 23:42:33 +0000 (18:42 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Jan 2020 19:48:41 +0000 (11:48 -0800)
This is a conversion case for the new function, keeping the flow of the
existing code as intact as possible. We also switch over to using
skb_mark_not_on_list instead of a null write to skb->next.

Finally, this code appeared to have a memory leak in the case where
header building fails before the last gso segment. In that case, the
remaining segments are not freed. So this commit also adds the proper
kfree_skb_list call for the remainder of the skbs.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mac80211/tx.c

index a8a7306a1f56c01bfaad49c412bc20222d642c61..4bd1faf4f779fb821579f9cea77c32c8e1007a2e 100644 (file)
@@ -3949,18 +3949,15 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
                }
        }
 
-       next = skb;
-       while (next) {
-               skb = next;
-               next = skb->next;
-
-               skb->prev = NULL;
-               skb->next = NULL;
+       skb_list_walk_safe(skb, skb, next) {
+               skb_mark_not_on_list(skb);
 
                skb = ieee80211_build_hdr(sdata, skb, info_flags,
                                          sta, ctrl_flags);
-               if (IS_ERR(skb))
+               if (IS_ERR(skb)) {
+                       kfree_skb_list(next);
                        goto out;
+               }
 
                ieee80211_tx_stats(dev, skb->len);