*
94266fa822ba "ospfd: Self nbrs needs to be rebuilt when router ID changes."
deleted the nbr_self, and added it back, but ospf_nbr_add_self doesn't
actually create the nbr_self - it assumes it's already there. Leading
to use after free and crashes after a router-id change.
* ospfd/ospf_neighbor.{c,h}: (ospf_nbr_self_reset) Little helper to reset the
nbr_self correctly.
* ospf_interface.c: (ospf_if_cleanup) moved code to ospf_nbr_self_reset
* ospfd.c: (ospf_router_id_update) Use ospf_nbr_self_reset instead of doing
the reset badly, fixing
94266fa822ba.
(cherry picked from commit
c920e510d09c6c4ab63a3da5375009442a950f82)
ospf_ls_upd_queue_empty (oi);
/* Reset pseudo neighbor. */
- ospf_nbr_delete (oi->nbr_self);
- oi->nbr_self = ospf_nbr_new (oi);
- ospf_nbr_add_self (oi);
+ ospf_nbr_self_reset (oi);
}
void
return 0;
}
+/* reset nbr_self */
+void
+ospf_nbr_self_reset (struct ospf_interface *oi)
+{
+ ospf_nbr_delete (oi->nbr_self);
+ oi->nbr_self = ospf_nbr_new (oi);
+ ospf_nbr_add_self (oi);
+}
+
/* Add self to nbr list. */
void
ospf_nbr_add_self (struct ospf_interface *oi)
extern void ospf_nbr_free (struct ospf_neighbor *);
extern void ospf_nbr_delete (struct ospf_neighbor *);
extern int ospf_nbr_bidirectional (struct in_addr *, struct in_addr *, int);
+extern void ospf_nbr_self_reset (struct ospf_interface *);
extern void ospf_nbr_add_self (struct ospf_interface *);
extern int ospf_nbr_count (struct ospf_interface *, int);
#ifdef HAVE_OPAQUE_LSA
* oi->nbr_self->router_id = router_id for
* !(virtual | ptop) links
*/
- ospf_nbr_delete(oi->nbr_self);
- ospf_nbr_add_self(oi);
+ ospf_nbr_self_reset (oi);
}
/* If AS-external-LSA is queued, then flush those LSAs. */