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.c 24 Nov 2014 12:43:54 -0000 1.146
> +++ netinet6/in6.c 26 Nov 2014 14:04:54 -0000
> @@ -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++;