On Mon, 2015-07-20 at 22:58 +0200, Martin Pieuchot wrote:
> On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> > On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > > Committed!  Thanks and sorry for the delay.
> > 
> > Hi!
> > 
> > You missed the previous patch "Fix ospfd segmentation fault on startup"
> > witch prevent ospfd from segfaulting on startup. Without this first
> > patch, ospfd will almost always segfault on startup (instead of just
> > sometime, which it does today).
> 
> Could you send a single diff for all these issues?  Apparently ospf
> hackers are slacking ;)

Yes, I have it as a single diff. I actually broke it up in two diffs
because the two issues are not really related. The second patch only
makes the first problem very obvious.
It would of course be best if we could make sure we set up event
handling (iev_ospfe et al.) before scanning interfaces, but it's kind of
a catch 22 here. The event handlers need the interface info to not
segfault... So the easy fix was to just check for null pointers in
main_imsg_compose_*.

/Johan



Index: interface.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
retrieving revision 1.75
diff -u -p -r1.75 interface.c
--- interface.c 14 May 2012 10:17:21 -0000      1.75
+++ interface.c 27 May 2015 16:42:51 -0000
@@ -338,8 +338,10 @@ if_act_start(struct iface *iface)
        struct in_addr           addr;
        struct timeval           now;
 
-       if (!((iface->flags & IFF_UP) &&
-           LINK_STATE_IS_UP(iface->linkstate)))
+       if (!(iface->flags & IFF_UP) ||
+           (!LINK_STATE_IS_UP(iface->linkstate) &&
+           !(iface->media_type == IFT_CARP &&
+           iface->linkstate == LINK_STATE_DOWN)))
                return (0);
 
        if (iface->media_type == IFT_CARP && iface->passive == 0) {
Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
retrieving revision 1.98
diff -u -p -r1.98 kroute.c
--- kroute.c    11 Feb 2015 05:57:44 -0000      1.98
+++ kroute.c    27 May 2015 16:42:51 -0000
@@ -1019,6 +1019,9 @@ if_change(u_short ifindex, int flags, st
                return;
        }
 
+       /* notify ospfe about interface link state */
+       main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
+
        reachable = (kif->flags & IFF_UP) &&
            LINK_STATE_IS_UP(kif->link_state);
 
@@ -1026,9 +1029,6 @@ if_change(u_short ifindex, int flags, st
                return;         /* nothing changed wrt nexthop validity */
 
        kif->nh_reachable = reachable;
-
-       /* notify ospfe about interface link state */
-       main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
 
        /* update redistribute list */
        RB_FOREACH(kr, kroute_tree, &krt) {
Index: ospfd.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
retrieving revision 1.83
diff -u -p -r1.83 ospfd.c
--- ospfd.c     10 Feb 2015 05:24:48 -0000      1.83
+++ ospfd.c     27 May 2015 16:42:51 -0000
@@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
 void
 main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-       imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
+       if (iev_ospfe)
+               imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
 }
 
 void
 main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-       imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
+       if (iev_rde)
+               imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
 }
 
 void

Reply via email to