Re: [PATCH] rtnetlink & address family problem
From: Thomas Graf <tgraf@suug.ch>
Date: 2004-12-06 14:02:14
* Michal Ludvig [ref] 2004-12-03 18:43
quoted hunk ↗ jump to hunk
running 'ip -6 addr flush dev eth0' on a kernel without IPv6 support flushes *all* addresses from the interface, even those IPv4 ones, because the unsupported protocol is substituted by PF_UNSPEC. IMHO it should better return with an error EAFNOSUPPORT. diff -Nru a/net/core/rtnetlink.c b/net/core/rtnetlink.c--- a/net/core/rtnetlink.c 2004-12-03 18:30:33 +01:00 +++ b/net/core/rtnetlink.c 2004-12-03 18:30:33 +01:00@@ -477,8 +477,10 @@ } link_tab = rtnetlink_links[family]; - if (link_tab == NULL) - link_tab = rtnetlink_links[PF_UNSPEC]; + if (link_tab == NULL) { + *errp = -EAFNOSUPPORT; + return -1; + } link = &link_tab[type]; sz_idx = type>>2;
Your patch would fix this issue but might break various things. The actual problem is that iproute2 doesn't check the family in its filter. It blindly assumes that the kernel only returns addresses of the kind it has requested. I can understand if you think the current behaviour is wrong but we shouldn't change it in the middle of a stable tree.
--- iproute2-2.6.9.orig/ip/ipaddress.c 2004-10-19 22:49:02.000000000 +0200
+++ iproute2-2.6.9/ip/ipaddress.c 2004-12-06 14:55:58.000000000 +0100@@ -330,6 +330,8 @@ return 0; } } + if (filter.family && filter.family != ifa->ifa_family) + return 0; if (filter.flushb) { struct nlmsghdr *fn;