]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: ipv6: fix dst refleaks in rpl, seg6 and ioam6 lwtunnels
authorJakub Kicinski <kuba@kernel.org>
Thu, 30 Jan 2025 03:15:18 +0000 (19:15 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:47:45 +0000 (12:47 +0100)
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
net/ipv6/seg6_iptunnel.c

index 95e84ec0352036daa859ec6509140bb9a68ab2a4..5d47948c03642508b10820383ba58eb6267fc0cb 100644 (file)
@@ -232,7 +232,6 @@ 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;
                }
 
@@ -251,6 +250,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;
 }
@@ -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);
 
index a73840da34ed9be4129b5a46a308b5f2cd3fc731..986459a85fbd1f2715368243561d82597d6773b0 100644 (file)
@@ -380,7 +380,6 @@ static int seg6_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;
                }
 
@@ -398,6 +397,7 @@ static int seg6_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;
 }