Hi Martin thanks for your patch. This patch works for me on OpenBSD 4.9-stable and -current. Still some issues left but at least ospf6d does not crash on interface add...
it would be really nice if this gets into the tree... Am 01.06.2011 22:46, schrieb Martin Pelikan: > Hi! > > So my last attempt wasn't met with much appreciation, so I'll slow down: > > - when I add a vlan(4), vether(4) or something, my ospf6d dies > - I don't like that > - therefore, with new release comes new diff > - this time I tried to make it as small as possible, in separate parts > > It doesn't fix departures (if_leave_group jumps on a non-existing > interface), but I guess people don't remove interfaces that often. > I will rewrite and post the rest of the big one if someone shows > interest in this bit. > > -- > Martin Pelikan > > > Index: kroute.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ospf6d/kroute.c,v > retrieving revision 1.30 > diff -u -p -r1.30 kroute.c > --- kroute.c 7 Mar 2011 07:43:02 -0000 1.30 > +++ kroute.c 1 Jun 2011 20:36:31 -0000 > @@ -973,15 +973,22 @@ if_announce(void *msg) > if ((iface = if_new(ifan->ifan_index, ifan->ifan_name)) == NULL) > fatal("if_announce failed"); > iface->cflags |= F_IFACE_AVAIL; > + main_imsg_compose_rde(IMSG_IFADD, 0, > + iface, sizeof(struct iface)); > + main_imsg_compose_ospfe(IMSG_IFADD, 0, > + iface, sizeof(struct iface)); > break; > case IFAN_DEPARTURE: > - iface = if_find(ifan->ifan_index); > - if (iface->cflags & F_IFACE_CONFIGURED) { > - main_imsg_compose_rde(IMSG_IFDELETE, 0, > - &iface->ifindex, sizeof(iface->ifindex)); > - main_imsg_compose_ospfe(IMSG_IFDELETE, 0, > - &iface->ifindex, sizeof(iface->ifindex)); > + if ((iface = if_find(ifan->ifan_index)) == NULL) { > + log_warn("someone announced departure of non-existing " > + "interface %s - possible race condition?", > + ifan->ifan_name); > + return; > } > + main_imsg_compose_rde(IMSG_IFDELETE, 0, > + &iface->ifindex, sizeof(iface->ifindex)); > + main_imsg_compose_ospfe(IMSG_IFDELETE, 0, > + &iface->ifindex, sizeof(iface->ifindex)); > if_del(iface); > break; > } > Index: ospfe.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ospf6d/ospfe.c,v > retrieving revision 1.34 > diff -u -p -r1.34 ospfe.c > --- ospfe.c 2 May 2011 09:24:00 -0000 1.34 > +++ ospfe.c 1 Jun 2011 20:36:31 -0000 > @@ -299,16 +299,16 @@ ospfe_dispatch_main(int fd, short event, > } > break; > case IMSG_IFADD: > - if ((iface = malloc(sizeof(struct iface))) == NULL) > - fatal(NULL); > - memcpy(iface, imsg.data, sizeof(struct iface)); > + ifp = imsg.data; > + if ((iface = if_new(ifp->ifindex, ifp->name)) == NULL) > + fatalx("IFADD in ospfe"); > > - LIST_INIT(&iface->nbr_list); > - TAILQ_INIT(&iface->ls_ack_list); > - RB_INIT(&iface->lsa_tree); > + /* ifaces from config belong to some area */ > + if ((iface->cflags & F_IFACE_CONFIGURED) && > + (area = area_find(oeconf, iface->area_id)) != NULL) > + LIST_INSERT_HEAD(&area->iface_list, iface, > + entry); > > - area = area_find(oeconf, iface->area_id); > - LIST_INSERT_HEAD(&area->iface_list, iface, entry); > break; > case IMSG_IFDELETE: > if (imsg.hdr.len != IMSG_HEADER_SIZE + > Index: rde.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ospf6d/rde.c,v > retrieving revision 1.52 > diff -u -p -r1.52 rde.c > --- rde.c 5 May 2011 15:58:02 -0000 1.52 > +++ rde.c 1 Jun 2011 20:36:31 -0000 > @@ -623,7 +623,7 @@ rde_dispatch_parent(int fd, short event, > { > static struct area *narea; > struct area *area; > - struct iface *iface; > + struct iface *iface, *ifp; > struct ifaddrchange *ifc; > struct iface_addr *ia, *nia; > struct imsg imsg; > @@ -710,16 +710,16 @@ rde_dispatch_parent(int fd, short event, > 0, -1, &kr, sizeof(kr)); > break; > case IMSG_IFADD: > - if ((iface = malloc(sizeof(struct iface))) == NULL) > - fatal(NULL); > - memcpy(iface, imsg.data, sizeof(struct iface)); > - > - LIST_INIT(&iface->nbr_list); > - TAILQ_INIT(&iface->ls_ack_list); > - RB_INIT(&iface->lsa_tree); > + ifp = imsg.data; > + if ((iface = if_new(ifp->ifindex, ifp->name)) == NULL) > + fatalx("IFADD in rde"); > + > + /* ifaces from config belong to area */ > + if ((iface->cflags & F_IFACE_CONFIGURED) && > + (area = area_find(rdeconf, iface->area_id)) != NULL) > + LIST_INSERT_HEAD(&area->iface_list, iface, > + entry); > > - area = area_find(rdeconf, iface->area_id); > - LIST_INSERT_HEAD(&area->iface_list, iface, entry); > break; > case IMSG_IFDELETE: > if (imsg.hdr.len != IMSG_HEADER_SIZE +