I did find a bug. Not certain wethe rthis is what affects you.
We look at fields from rt_msghdr that the RTM_IFINFO messages do not 
have - they use if_msghdr instead. We do abort on rtm->rtm_errno != 0, 
but if_msghdr has no errno, so we look at something in the data part 
instead. Surprising that this didn't bite us before!
So we must only do these checks for RTM_ADD/CHANGE/DELETE that actually 
use rt_msghdr.
ospfd has teh same issue.

Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.145
diff -u -p -r1.145 kroute.c
--- kroute.c    22 Mar 2006 13:30:35 -0000      1.145
+++ kroute.c    11 Apr 2006 11:07:27 -0000
@@ -2123,21 +2123,23 @@ dispatch_rtmsg(void)
        lim = buf + n;
        for (next = buf; next < lim; next += rtm->rtm_msglen) {
                rtm = (struct rt_msghdr *)next;
-               sa = (struct sockaddr *)(rtm + 1);
-               get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
-
-               if (rtm->rtm_pid == kr_state.pid)       /* cause by us */
-                       continue;
-
-               if (rtm->rtm_errno)                     /* failed attempts... */
-                       continue;
 
                switch (rtm->rtm_type) {
                case RTM_ADD:
                case RTM_CHANGE:
                case RTM_DELETE:
+                       sa = (struct sockaddr *)(rtm + 1);
+                       get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
+
+                       if (rtm->rtm_pid == kr_state.pid)       /* cause by us 
*/
+                               continue;
+
+                       if (rtm->rtm_errno)                     /* failed 
attempts... */
+                               continue;
+
                        if (rtm->rtm_flags & RTF_LLINFO)        /* arp cache */
                                continue;
+
                        if (dispatch_rtmsg_addr(rtm, rti_info) == -1)
                                return (-1);
                        break;


-- 
BS Web Services, http://www.bsws.de/
OpenBSD-based Webhosting, Mail Services, Managed Servers, ...
Unix is very simple, but it takes a genius to understand the simplicity.
(Dennis Ritchie)

Reply via email to