From: Christian Franke Date: Tue, 16 Oct 2018 15:36:45 +0000 (+0200) Subject: isisd: Unlink LSP fragments from LSP0 on lsp_destroy X-Git-Tag: frr-7.1-dev~266^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=dc84cf1494df750a6da4862185fba5cb3a29645e;p=matthieu%2Ffrr.git isisd: Unlink LSP fragments from LSP0 on lsp_destroy isisd would crash when lsp fragments aged out, since they got freed correctly, but were not removed from LSP0's linked list of fragments. Signed-off-by: Christian Franke --- diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 61ba51ffb8..bf61ae05b0 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -110,6 +110,8 @@ static void lsp_clear_data(struct isis_lsp *lsp) lsp->tlvs = NULL; } +static void lsp_remove_frags(struct list *frags, dict_t *lspdb); + static void lsp_destroy(struct isis_lsp *lsp) { struct listnode *cnode; @@ -125,9 +127,17 @@ static void lsp_destroy(struct isis_lsp *lsp) lsp_clear_data(lsp); - if (LSP_FRAGMENT(lsp->hdr.lsp_id) == 0 && lsp->lspu.frags) { - list_delete(&lsp->lspu.frags); - lsp->lspu.frags = NULL; + if (!LSP_FRAGMENT(lsp->hdr.lsp_id)) { + if (lsp->lspu.frags) { + lsp_remove_frags(lsp->lspu.frags, + lsp->area->lspdb[lsp->level - 1]); + list_delete(&lsp->lspu.frags); + } + } else { + if (lsp->lspu.zero_lsp + && lsp->lspu.zero_lsp->lspu.frags) { + listnode_delete(lsp->lspu.zero_lsp->lspu.frags, lsp); + } } isis_spf_schedule(lsp->area, lsp->level); @@ -170,10 +180,6 @@ static void lsp_remove_frags(struct list *frags, dict_t *lspdb) lsp_destroy(lsp); dnode_destroy(dict_delete(lspdb, dnode)); } - - list_delete_all_node(frags); - - return; } void lsp_search_and_destroy(uint8_t *id, dict_t *lspdb)