Skip to content

Commit 69172f0

Browse files
zenczykowskikuba-moo
authored andcommitted
ipv6 addrconf: fix bug where deleting a mngtmpaddr can create a new temporary address
currently on 6.4 net/main: # ip link add dummy1 type dummy # echo 1 > /proc/sys/net/ipv6/conf/dummy1/use_tempaddr # ip link set dummy1 up # ip -6 addr add 2000::1/64 mngtmpaddr dev dummy1 # ip -6 addr show dev dummy1 11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 inet6 2000::44f3:581c:8ca:3983/64 scope global temporary dynamic valid_lft 604800sec preferred_lft 86172sec inet6 2000::1/64 scope global mngtmpaddr valid_lft forever preferred_lft forever inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link valid_lft forever preferred_lft forever # ip -6 addr del 2000::44f3:581c:8ca:3983/64 dev dummy1 (can wait a few seconds if you want to, the above delete isn't [directly] the problem) # ip -6 addr show dev dummy1 11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 inet6 2000::1/64 scope global mngtmpaddr valid_lft forever preferred_lft forever inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link valid_lft forever preferred_lft forever # ip -6 addr del 2000::1/64 mngtmpaddr dev dummy1 # ip -6 addr show dev dummy1 11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 inet6 2000::81c9:56b7:f51a:b98f/64 scope global temporary dynamic valid_lft 604797sec preferred_lft 86169sec inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link valid_lft forever preferred_lft forever This patch prevents this new 'global temporary dynamic' address from being created by the deletion of the related (same subnet prefix) 'mngtmpaddr' (which is triggered by there already being no temporary addresses). Cc: Jiri Pirko <jiri@resnulli.us> Fixes: 53bd674 ("ipv6 addrconf: introduce IFA_F_MANAGETEMPADDR to tell kernel to manage temporary addresses") Reported-by: Xiao Ma <xiaom@google.com> Signed-off-by: Maciej Żenczykowski <maze@google.com> Reviewed-by: David Ahern <dsahern@kernel.org> Link: https://lore.kernel.org/r/20230720160022.1887942-1-maze@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 69a184f commit 69172f0

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

net/ipv6/addrconf.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2561,12 +2561,18 @@ static void manage_tempaddrs(struct inet6_dev *idev,
25612561
ipv6_ifa_notify(0, ift);
25622562
}
25632563

2564-
if ((create || list_empty(&idev->tempaddr_list)) &&
2565-
idev->cnf.use_tempaddr > 0) {
2564+
/* Also create a temporary address if it's enabled but no temporary
2565+
* address currently exists.
2566+
* However, we get called with valid_lft == 0, prefered_lft == 0, create == false
2567+
* as part of cleanup (ie. deleting the mngtmpaddr).
2568+
* We don't want that to result in creating a new temporary ip address.
2569+
*/
2570+
if (list_empty(&idev->tempaddr_list) && (valid_lft || prefered_lft))
2571+
create = true;
2572+
2573+
if (create && idev->cnf.use_tempaddr > 0) {
25662574
/* When a new public address is created as described
25672575
* in [ADDRCONF], also create a new temporary address.
2568-
* Also create a temporary address if it's enabled but
2569-
* no temporary address currently exists.
25702576
*/
25712577
read_unlock_bh(&idev->lock);
25722578
ipv6_create_tempaddr(ifp, false);

0 commit comments

Comments
 (0)