ipv4: Fix route refcount on pmtu discovery
Subsystems (3)
PATCH 1/1 ipv4: Fix route refcount on pmtu discovery
git commit 9cb3a50c (ipv4: Invalidate the socket cached route on pmtu events if possible) introduced a refcount problem. We don't get a refcount on the route if we get it from__sk_dst_get(), but we need one if we want to reuse this route because __sk_dst_set() releases the refcount of the old route. This patch adds proper refcount handling for that case. We introduce a 'new' flag to indicate that we are going to use a new route and we release the old route only if we replace it by a new one.
--- net/ipv4/route.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/ipv4/route.c +9 -2
@@ -985,6 +985,7 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu)struct flowi4 fl4;struct rtable *rt;struct dst_entry *dst; +bool new = false;bh_lock_sock (sk); rt = (struct rtable *)__sk_dst_get (sk);
@@ -1000,20 +1001,26 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) rt =ip_route_output_flow (sock_net (sk), &fl4, sk);if (IS_ERR (rt)) goto out; + + new = true; }__ip_rt_update_pmtu ((struct rtable *) rt->dst.path, &fl4, mtu); dst =dst_check (&rt->dst,0 );if (!dst) { +if (new) +dst_release (&rt->dst); + rt =ip_route_output_flow (sock_net (sk), &fl4, sk);if (IS_ERR (rt)) goto out; - dst = &rt->dst; + new = true; } -__sk_dst_set (sk, dst); +if (new) +__sk_dst_set (sk, &rt->dst); out:bh_unlock_sock (sk);
Signature · 1 line
1.7.9.5
From: Steffen Klassert <[email protected]>
Date: Tue, 22 Jan 2013 11:01:28 +0100
Quoted 11 lines
git commit
9cb3a50c(ipv4: Invalidate the socket cached route on pmtu events if possible) introduced a refcount problem. We don't get a refcount on the route if we get itfrom__sk_dst_get(), but we need one if we want to reuse this route because__sk_dst_set()releases the refcount of the old route. This patch adds proper refcount handling for that case. We introduce a 'new' flag to indicate that we are going to use a new route and we release the old route only if we replace it by a new one.Reported-by Julian Anastasov <[email protected]>Signed-off-by Steffen Klassert <[email protected]>
Applied, thanks.