Johan Ymerson([email protected]) on 2015.07.20 21:32:20 +0000:
> 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
fixed it.
ok benno@
>
>
>
> 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
>
--