Doing (ifam + 1) to find the start of the sockaddrs in a rt msg is wrong better use the rtm_hdrlen field.
I only compile tested this since I have nothing that uses the IPv6 autoconfiguration crap. -- :wq Claudio Index: usr.sbin/rtadvd/if.c =================================================================== RCS file: /cvs/src/usr.sbin/rtadvd/if.c,v retrieving revision 1.23 diff -u -p -r1.23 if.c --- usr.sbin/rtadvd/if.c 21 May 2010 13:41:23 -0000 1.23 +++ usr.sbin/rtadvd/if.c 4 Jul 2011 05:54:44 -0000 @@ -269,9 +269,11 @@ get_next_msg(char *buf, char *lim, int i case RTM_NEWADDR: case RTM_DELADDR: ifam = (struct ifa_msghdr *)rtm; + if (ifindex && ifam->ifam_index != ifindex) + continue; /* address related checks */ - sa = (struct sockaddr *)(ifam + 1); + sa = (struct sockaddr *)((char *)rtm + rtm->rtm_hdrlen); get_rtaddrs(ifam->ifam_addrs, sa, rti_info); if ((ifa = rti_info[RTAX_IFA]) == NULL || (ifa->sa_family != AF_INET && @@ -283,11 +285,8 @@ get_next_msg(char *buf, char *lim, int i IN6_IS_ADDR_MULTICAST(&SIN6(ifa)->sin6_addr))) continue; - if (ifindex && ifam->ifam_index != ifindex) - continue; - /* found */ - *lenp = ifam->ifam_msglen; + *lenp = rtm->rtm_msglen; return (char *)rtm; /* NOTREACHED */ case RTM_IFINFO: