]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Mar 2025 17:00:42 +0000 (18:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Mar 2025 17:00:42 +0000 (18:00 +0100)
added patches:
net-ipv6-fix-dst-refleaks-in-rpl-seg6-and-ioam6-lwtunnels.patch

queue-5.15/net-ipv6-fix-dst-refleaks-in-rpl-seg6-and-ioam6-lwtunnels.patch [new file with mode: 0644]

diff --git a/queue-5.15/net-ipv6-fix-dst-refleaks-in-rpl-seg6-and-ioam6-lwtunnels.patch b/queue-5.15/net-ipv6-fix-dst-refleaks-in-rpl-seg6-and-ioam6-lwtunnels.patch
new file mode 100644 (file)
index 0000000..f6dc322
--- /dev/null
@@ -0,0 +1,87 @@
+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;
+ }