add a fix for memleaks caused by failed memory allocations
authorFelix Fietkau <nbd@openwrt.org>
Fri, 8 Feb 2008 05:13:06 +0000 (05:13 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 8 Feb 2008 05:13:06 +0000 (05:13 +0000)
SVN-Revision: 10417

package/madwifi/patches/331-memory_alloc.patch [new file with mode: 0644]

diff --git a/package/madwifi/patches/331-memory_alloc.patch b/package/madwifi/patches/331-memory_alloc.patch
new file mode 100644 (file)
index 0000000..2d218a4
--- /dev/null
@@ -0,0 +1,44 @@
+Index: madwifi-trunk-r3314/ath/if_ath.c
+===================================================================
+--- madwifi-trunk-r3314.orig/ath/if_ath.c      2008-02-08 04:11:11.775823441 +0100
++++ madwifi-trunk-r3314/ath/if_ath.c   2008-02-08 05:46:16.761139918 +0100
+@@ -3308,17 +3308,18 @@
+        * without affecting any other bridge ports. */
+       if (skb_cloned(skb)) {
+               /* Remember the original SKB so we can free up our references */
+-              struct sk_buff *skb_orig = skb;
+-              skb = skb_copy(skb, GFP_ATOMIC);
+-              if (skb == NULL) {
++              struct sk_buff *skb_new;
++              skb_new = skb_copy(skb, GFP_ATOMIC);
++              if (skb_new == NULL) {
+                       DPRINTF(sc, ATH_DEBUG_XMIT,
+                               "Dropping; skb_copy failure.\n");
+                       /* No free RAM, do not requeue! */
+                       goto hardstart_fail;
+               }
+-              ieee80211_skb_copy_noderef(skb_orig, skb);
+-              ieee80211_dev_kfree_skb(&skb_orig);
+-      } 
++              ieee80211_skb_copy_noderef(skb, skb_new);
++              ieee80211_dev_kfree_skb(&skb);
++              skb = skb_new;
++      }
+       eh = (struct ether_header *)skb->data;
+ #ifdef ATH_SUPERG_FF
+@@ -3584,11 +3585,13 @@
+        */
+       error = ath_tx_start(dev, SKB_CB(skb)->ni, bf, skb, 0);
+       if (error)
+-              goto bad;
++              return error;
+       sc->sc_stats.ast_tx_mgmt++;
+       return 0;
+ bad:
++      if (skb)
++              ieee80211_dev_kfree_skb(&skb);
+       ath_return_txbuf(sc, &bf);
+       return error;
+ }