--- /dev/null
+From c71a192976ded2f2f416d03c4f595cdd4478b825 Mon Sep 17 00:00:00 2001
+From: Jakub Kicinski <kuba@kernel.org>
+Date: Wed, 29 Jan 2025 19:15:18 -0800
+Subject: net: ipv6: fix dst refleaks in rpl, seg6 and ioam6 lwtunnels
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+commit c71a192976ded2f2f416d03c4f595cdd4478b825 upstream.
+
+dst_cache_get() gives us a reference, we need to release it.
+
+Discovered by the ioam6.sh test, kmemleak was recently fixed
+to catch per-cpu memory leaks.
+
+Fixes: 985ec6f5e623 ("net: ipv6: rpl_iptunnel: mitigate 2-realloc issue")
+Fixes: 40475b63761a ("net: ipv6: seg6_iptunnel: mitigate 2-realloc issue")
+Fixes: dce525185bc9 ("net: ipv6: ioam6_iptunnel: mitigate 2-realloc issue")
+Reviewed-by: Justin Iurman <justin.iurman@uliege.be>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/20250130031519.2716843-1-kuba@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv6/rpl_iptunnel.c | 6 ++++--
+ net/ipv6/seg6_iptunnel.c | 6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/net/ipv6/rpl_iptunnel.c
++++ b/net/ipv6/rpl_iptunnel.c
+@@ -232,7 +232,6 @@ static int rpl_output(struct net *net, s
+ dst = ip6_route_output(net, NULL, &fl6);
+ if (dst->error) {
+ err = dst->error;
+- dst_release(dst);
+ goto drop;
+ }
+
+@@ -251,6 +250,7 @@ static int rpl_output(struct net *net, s
+ return dst_output(net, sk, skb);
+
+ drop:
++ dst_release(dst);
+ kfree_skb(skb);
+ return err;
+ }
+@@ -277,8 +277,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;
++ }
+
+ skb_dst_drop(skb);
+
+--- a/net/ipv6/seg6_iptunnel.c
++++ b/net/ipv6/seg6_iptunnel.c
+@@ -490,8 +490,10 @@ static int seg6_input_core(struct net *n
+ local_bh_enable();
+
+ err = seg6_do_srh(skb, dst);
+- if (unlikely(err))
++ if (unlikely(err)) {
++ dst_release(dst);
+ goto drop;
++ }
+
+ skb_dst_drop(skb);
+
+@@ -582,7 +584,6 @@ static int seg6_output_core(struct net *
+ dst = ip6_route_output(net, NULL, &fl6);
+ if (dst->error) {
+ err = dst->error;
+- dst_release(dst);
+ goto drop;
+ }
+
+@@ -604,6 +605,7 @@ static int seg6_output_core(struct net *
+
+ return dst_output(net, sk, skb);
+ drop:
++ dst_release(dst);
+ kfree_skb(skb);
+ return err;
+ }