summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhou-run <166502045+zhou-run@users.noreply.github.com>2024-04-09 21:04:39 +0800
committerMergify <37929162+mergify[bot]@users.noreply.github.com>2024-10-29 15:19:54 +0000
commitf145648d0a9b92cff8ac99429fcc90a1527317b9 (patch)
tree3b68e5b5c2fc0a43ca4efc2efa056cbb72c561dc
parentb14878822e8d3cba1a4801a36df2e9303e5598b0 (diff)
isisd: Fix memory leaks when the transition of neighbor state from non-UP to DOWN
When receiving a hello packet, if the neighbor state transitions directly from a non-ISIS_ADJ_UP state (such as ISIS_ADJ_INITIALIZING) to ISIS_ADJ_DOWN state, the neighbor entry cannot be deleted. If the neighbor is removed or the neighbor's System ID changes, it may result in memory leakage in the neighbor entry. Test Scenario: LAN link between Router A and Router B is established. Router A does not configure neighbor authentication, while Router B is configured with neighbor authentication. When the neighbor entry on Router B ages out, the neighbor state on Router A transitions to INIT. If Router B is then removed, the neighbor state on Router A transitions to DOWN and persists. Signed-off-by: zhou-run <166502045+zhou-run@users.noreply.github.com> fix frrbot styling issues found. fix frrbot styling issues found. Signed-off-by: zhou-run <166502045+zhou-run@users.noreply.github.com> (cherry picked from commit 5009f7539ad6bf496158499917dcf3f7ab760753)
-rw-r--r--isisd/isis_adjacency.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c
index c04f8155ba..056a21001d 100644
--- a/isisd/isis_adjacency.c
+++ b/isisd/isis_adjacency.c
@@ -358,12 +358,15 @@ void isis_adj_state_change(struct isis_adjacency **padj,
* purposes */
adj->last_flap = time(NULL);
adj->flaps++;
- } else if (old_state == ISIS_ADJ_UP) {
- circuit->adj_state_changes++;
+ } else {
+ if (old_state == ISIS_ADJ_UP) {
+ circuit->adj_state_changes++;
- circuit->upadjcount[level - 1]--;
- if (circuit->upadjcount[level - 1] == 0)
- isis_tx_queue_clean(circuit->tx_queue);
+ circuit->upadjcount[level - 1]--;
+ if (circuit->upadjcount[level - 1] == 0)
+ isis_tx_queue_clean(
+ circuit->tx_queue);
+ }
if (new_state == ISIS_ADJ_DOWN) {
listnode_delete(
@@ -409,10 +412,13 @@ void isis_adj_state_change(struct isis_adjacency **padj,
master, send_l2_csnp, circuit,
0, &circuit->t_send_csnp[1]);
}
- } else if (old_state == ISIS_ADJ_UP) {
- circuit->upadjcount[level - 1]--;
- if (circuit->upadjcount[level - 1] == 0)
- isis_tx_queue_clean(circuit->tx_queue);
+ } else {
+ if (old_state == ISIS_ADJ_UP) {
+ circuit->upadjcount[level - 1]--;
+ if (circuit->upadjcount[level - 1] == 0)
+ isis_tx_queue_clean(
+ circuit->tx_queue);
+ }
if (new_state == ISIS_ADJ_DOWN) {
if (adj->circuit->u.p2p.neighbor == adj)