summaryrefslogtreecommitdiff
path: root/net/ipv6/rpl_iptunnel.c
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2025-02-18 09:43:43 +0300
committerThomas Zimmermann <tzimmermann@suse.de>2025-02-18 09:43:43 +0300
commit8bd1a8e7572c1012b19e4f57e2f49451820167ef (patch)
treed3e324f78d3b3bb7cf244be9c09ee463afd0ff7e /net/ipv6/rpl_iptunnel.c
parentb296955b3a740ecc8b3b08e34fd64f1ceabb8fb4 (diff)
parent0ed1356af8f629ae807963b7db4e501e3b580bc2 (diff)
downloadlinux-8bd1a8e7572c1012b19e4f57e2f49451820167ef.tar.xz
Merge drm/drm-next into drm-misc-next
Backmerging to get bugfixes from v6.14-rc2. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Diffstat (limited to 'net/ipv6/rpl_iptunnel.c')
-rw-r--r--net/ipv6/rpl_iptunnel.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/net/ipv6/rpl_iptunnel.c b/net/ipv6/rpl_iptunnel.c
index 7ba22d2f2bfe..0ac4283acdf2 100644
--- a/net/ipv6/rpl_iptunnel.c
+++ b/net/ipv6/rpl_iptunnel.c
@@ -232,13 +232,15 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
dst = ip6_route_output(net, NULL, &fl6);
if (dst->error) {
err = dst->error;
- dst_release(dst);
goto drop;
}
- local_bh_disable();
- dst_cache_set_ip6(&rlwt->cache, dst, &fl6.saddr);
- local_bh_enable();
+ /* cache only if we don't create a dst reference loop */
+ if (orig_dst->lwtstate != dst->lwtstate) {
+ local_bh_disable();
+ dst_cache_set_ip6(&rlwt->cache, dst, &fl6.saddr);
+ local_bh_enable();
+ }
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
if (unlikely(err))
@@ -251,6 +253,7 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
return dst_output(net, sk, skb);
drop:
+ dst_release(dst);
kfree_skb(skb);
return err;
}
@@ -269,8 +272,10 @@ static int rpl_input(struct sk_buff *skb)
local_bh_enable();
err = rpl_do_srh(skb, rlwt, dst);
- if (unlikely(err))
+ if (unlikely(err)) {
+ dst_release(dst);
goto drop;
+ }
if (!dst) {
ip6_route_input(skb);