On Wed, Nov 26, 2014 at 03:09:08PM +0100, Martin Pieuchot wrote:
While debugging the recent route change regression I found various
bugs in the code handling IPv6 addresses. The most ugly one, because
it leaves you with a null ifp pointer in your routing table, is fixed
by the diff below.
Basically if you try to remove an address from an interface, by deleting
it for example, in one rdomain and you have the same address in another
rdomain you wont remove the route.
You can run rttest14 and rttest16 in regress/sbin/route to see what
happens.
Ok?
OK bluhm@
Index: netinet6/in6.c
===
RCS file: /home/ncvs/src/sys/netinet6/in6.c,v
retrieving revision 1.146
diff -u -p -r1.146 in6.c
--- netinet6/in6.c24 Nov 2014 12:43:54 - 1.146
+++ netinet6/in6.c26 Nov 2014 14:04:54 -
@@ -1053,6 +1053,9 @@ in6_purgeaddr(struct ifaddr *ifa)
* XXX: we should avoid such a configuration in IPv6...
*/
TAILQ_FOREACH(tmp, in6_ifaddr, ia_list) {
+ if (tmp-ia_ifp-if_rdomain != ifp-if_rdomain)
+ continue;
+
if (IN6_ARE_ADDR_EQUAL(tmp-ia_addr.sin6_addr,
ia6-ia_addr.sin6_addr)) {
ia6_count++;