aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasundhara Volam <vasundhara.volam@emulex.com>2014-03-03 03:55:07 -0500
committerDavid S. Miller <davem@davemloft.net>2014-03-03 15:48:11 -0500
commitc91289510602baf9a05b3501d97dc70efa269e01 (patch)
treeca35e96ec6ad4c126085a65f517e2da2f38b44ec
parent7ad09458a5be9a0990457c1a198e702559ac25ca (diff)
be2net: Fix skb double free in be_xmit_wrokarounds() failure path
skb_padto(), skb_share_check() and __vlan_put_tag() routines free skb when they return an error. This patch fixes be_xmit_workarounds() to not free skb again in such cases. Signed-off-by: Vasundhara Volam <vasundhara.volam@emulex.com> Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 9e6d678bca43..a9da6f94e2fd 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -927,7 +927,7 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter,
927 */ 927 */
928 if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { 928 if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) {
929 if (skb_padto(skb, 36)) 929 if (skb_padto(skb, 36))
930 goto tx_drop; 930 goto err;
931 skb->len = 36; 931 skb->len = 36;
932 } 932 }
933 933
@@ -959,7 +959,7 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter,
959 vlan_tx_tag_present(skb)) { 959 vlan_tx_tag_present(skb)) {
960 skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); 960 skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan);
961 if (unlikely(!skb)) 961 if (unlikely(!skb))
962 goto tx_drop; 962 goto err;
963 } 963 }
964 964
965 /* HW may lockup when VLAN HW tagging is requested on 965 /* HW may lockup when VLAN HW tagging is requested on
@@ -981,12 +981,13 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter,
981 be_vlan_tag_tx_chk(adapter, skb)) { 981 be_vlan_tag_tx_chk(adapter, skb)) {
982 skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan); 982 skb = be_insert_vlan_in_pkt(adapter, skb, skip_hw_vlan);
983 if (unlikely(!skb)) 983 if (unlikely(!skb))
984 goto tx_drop; 984 goto err;
985 } 985 }
986 986
987 return skb; 987 return skb;
988tx_drop: 988tx_drop:
989 dev_kfree_skb_any(skb); 989 dev_kfree_skb_any(skb);
990err:
990 return NULL; 991 return NULL;
991} 992}
992 993