diff options
author | Vasundhara Volam <vasundhara.volam@emulex.com> | 2014-03-03 03:55:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-03-03 15:48:11 -0500 |
commit | c91289510602baf9a05b3501d97dc70efa269e01 (patch) | |
tree | ca35e96ec6ad4c126085a65f517e2da2f38b44ec | |
parent | 7ad09458a5be9a0990457c1a198e702559ac25ca (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.c | 7 |
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; |
988 | tx_drop: | 988 | tx_drop: |
989 | dev_kfree_skb_any(skb); | 989 | dev_kfree_skb_any(skb); |
990 | err: | ||
990 | return NULL; | 991 | return NULL; |
991 | } | 992 | } |
992 | 993 | ||