diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2014-12-23 16:20:32 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-23 23:57:31 -0500 |
commit | 997e068ebc17d8d57e735578df44b6341cd5f2f3 (patch) | |
tree | 2fc6e7b30a84898baeb28fd3ec783e292541335c /net/ipv4 | |
parent | cbe7e76d94f59e89302bd514e4b685e03d1ebbe4 (diff) | |
download | linux-997e068ebc17d8d57e735578df44b6341cd5f2f3.tar.bz2 |
openvswitch: Fix vport_send double free
Today vport-send has complex error handling because it involves
freeing skb and updating stats depending on return value from
vport send implementation.
This can be simplified by delegating responsibility of freeing
skb to the vport implementation for all cases. So that
vport-send needs just update stats.
Fixes: 91b7514cdf ("openvswitch: Unify vport error stats
handling")
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/geneve.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv4/geneve.c b/net/ipv4/geneve.c index 95e47c97585e..394a200f93c1 100644 --- a/net/ipv4/geneve.c +++ b/net/ipv4/geneve.c @@ -122,14 +122,18 @@ int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, int err; skb = udp_tunnel_handle_offloads(skb, !gs->sock->sk->sk_no_check_tx); + if (IS_ERR(skb)) + return PTR_ERR(skb); min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr) + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0); err = skb_cow_head(skb, min_headroom); - if (unlikely(err)) + if (unlikely(err)) { + kfree_skb(skb); return err; + } skb = vlan_hwaccel_push_inside(skb); if (unlikely(!skb)) |