From: Igor Ryzhov Date: Thu, 29 Jul 2021 11:42:16 +0000 (+0300) Subject: bgpd: fix missing list add in dampening X-Git-Tag: frr-8.0.1~44^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=refs%2Fpull%2F9233%2Fhead;p=mirror%2Ffrr.git bgpd: fix missing list add in dampening One more crash in dampening code... When bgp_damp_withdraw is called, if there's already a BDI structure, bgp_damp_info_claim is called to re-assign the bdi->config in case it was changed. The problem is that bgp_damp_info_claim actually removes the BDI from the reuse list of the old config and never adds it to the reuse list of the new config. We must do this to prevent the crash because all the code assumes that BDI is always in some list. Signed-off-by: Igor Ryzhov --- diff --git a/bgpd/bgp_damp.c b/bgpd/bgp_damp.c index 46dff9d7e3..ea6bf296d8 100644 --- a/bgpd/bgp_damp.c +++ b/bgpd/bgp_damp.c @@ -343,7 +343,14 @@ int bgp_damp_withdraw(struct bgp_path_info *path, struct bgp_dest *dest, (bgp_path_info_extra_get(path))->damp_info = bdi; bgp_no_reuse_list_add(bdi, bdc); } else { - bgp_damp_info_claim(bdi, bdc); + if (bdi->config != bdc) { + bgp_damp_info_claim(bdi, bdc); + if (bdi->index == BGP_DAMP_NO_REUSE_LIST_INDEX) + bgp_reuselist_add(&bdc->no_reuse_list, bdi); + else + bgp_reuselist_add(&bdc->reuse_list[bdi->index], + bdi); + } last_penalty = bdi->penalty; /* 1. Set t-diff = t-now - t-updated. */