From dc84cf1494df750a6da4862185fba5cb3a29645e Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Tue, 16 Oct 2018 17:36:45 +0200 Subject: [PATCH] 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 --- isisd/isis_lsp.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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) -- 2.39.5