]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ipv6: prevent possible UaF in addrconf_permanent_addr()
authorPaolo Abeni <pabeni@redhat.com>
Fri, 27 Mar 2026 09:52:57 +0000 (10:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 31 Mar 2026 00:25:10 +0000 (17:25 -0700)
The mentioned helper try to warn the user about an exceptional
condition, but the message is delivered too late, accessing the ipv6
after its possible deletion.

Reorder the statement to avoid the possible UaF; while at it, place the
warning outside the idev->lock as it needs no protection.

Reported-by: Jakub Kicinski <kuba@kernel.org>
Closes: https://sashiko.dev/#/patchset/8c8bfe2e1a324e501f0e15fef404a77443fd8caf.1774365668.git.pabeni%40redhat.com
Fixes: f1705ec197e7 ("net: ipv6: Make address flushing on ifdown optional")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Link: https://patch.msgid.link/ef973c3a8cb4f8f1787ed469f3e5391b9fe95aa0.1774601542.git.pabeni@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/addrconf.c

index f4e23b543585f80536e48f3297f67b8b6bb1c40c..dd0b4d80e0f84df338bfbdca43a4969787cad325 100644 (file)
@@ -3625,12 +3625,12 @@ static void addrconf_permanent_addr(struct net *net, struct net_device *dev)
                if ((ifp->flags & IFA_F_PERMANENT) &&
                    fixup_permanent_addr(net, idev, ifp) < 0) {
                        write_unlock_bh(&idev->lock);
-                       in6_ifa_hold(ifp);
-                       ipv6_del_addr(ifp);
-                       write_lock_bh(&idev->lock);
 
                        net_info_ratelimited("%s: Failed to add prefix route for address %pI6c; dropping\n",
                                             idev->dev->name, &ifp->addr);
+                       in6_ifa_hold(ifp);
+                       ipv6_del_addr(ifp);
+                       write_lock_bh(&idev->lock);
                }
        }