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:

Reply via email to