diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2024-08-13 08:44:59 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-13 08:44:59 -0400 | 
| commit | b026de1f6ca7d977b8514c80da1c64289306604f (patch) | |
| tree | 32b245ce1251e48d2f2e8cd4281479ba8084fba5 | |
| parent | 8d70c35a4a56a6f9757c796d19c96409d2b8c124 (diff) | |
| parent | 010817a19548733c9b970e01a44cb6c2a14d890d (diff) | |
Merge pull request #16565 from FRRouting/mergify/bp/stable/10.0/pr-16545
isisd: fix memory handling in isis_adj_process_threeway() (backport #16545)
| -rw-r--r-- | isisd/isis_adjacency.c | 8 | ||||
| -rw-r--r-- | isisd/isis_adjacency.h | 2 | ||||
| -rw-r--r-- | isisd/isis_pdu.c | 16 | 
3 files changed, 13 insertions, 13 deletions
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 32d3466f5c..44555079ad 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -231,11 +231,12 @@ static void isis_adj_route_switchover(struct isis_adjacency *adj)  	}  } -void isis_adj_process_threeway(struct isis_adjacency *adj, +void isis_adj_process_threeway(struct isis_adjacency **padj,  			       struct isis_threeway_adj *tw_adj,  			       enum isis_adj_usage adj_usage)  {  	enum isis_threeway_state next_tw_state = ISIS_THREEWAY_DOWN; +	struct isis_adjacency *adj = *padj;  	if (tw_adj && !adj->circuit->disable_threeway_adj) {  		if (tw_adj->state == ISIS_THREEWAY_DOWN) { @@ -265,14 +266,13 @@ void isis_adj_process_threeway(struct isis_adjacency *adj,  		fabricd_initial_sync_hello(adj->circuit);  	if (next_tw_state == ISIS_THREEWAY_DOWN) { -		isis_adj_state_change(&adj, ISIS_ADJ_DOWN, -				      "Neighbor restarted"); +		isis_adj_state_change(padj, ISIS_ADJ_DOWN, "Neighbor restarted");  		return;  	}  	if (next_tw_state == ISIS_THREEWAY_UP) {  		if (adj->adj_state != ISIS_ADJ_UP) { -			isis_adj_state_change(&adj, ISIS_ADJ_UP, NULL); +			isis_adj_state_change(padj, ISIS_ADJ_UP, NULL);  			adj->adj_usage = adj_usage;  		}  	} diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index b5c7dd8d73..0ad36e4c5f 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -111,7 +111,7 @@ struct isis_adjacency *isis_adj_find(const struct isis_area *area, int level,  struct isis_adjacency *isis_new_adj(const uint8_t *id, const uint8_t *snpa,  				    int level, struct isis_circuit *circuit);  void isis_delete_adj(void *adj); -void isis_adj_process_threeway(struct isis_adjacency *adj, +void isis_adj_process_threeway(struct isis_adjacency **padj,  			       struct isis_threeway_adj *tw_adj,  			       enum isis_adj_usage adj_usage);  DECLARE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)); diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 6f410d342e..6a6c461144 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -281,14 +281,14 @@ static int process_p2p_hello(struct iih_info *iih)  		if (iih->calculated_type == IS_LEVEL_1) {  			switch (iih->circ_type) {  			case IS_LEVEL_1: -				isis_adj_process_threeway(adj, tw_adj, +				isis_adj_process_threeway(&adj, tw_adj,  							  iih->calculated_type);  				break;  			case IS_LEVEL_1_AND_2:  				if ((adj->adj_state != ISIS_ADJ_UP) ||  				    (adj->adj_usage == ISIS_ADJ_LEVEL1) ||  				    (adj->adj_usage == ISIS_ADJ_LEVEL1AND2)) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				}  				break; @@ -301,7 +301,7 @@ static int process_p2p_hello(struct iih_info *iih)  			case IS_LEVEL_1:  				if (adj->adj_state != ISIS_ADJ_UP  				    || adj->adj_usage == ISIS_ADJ_LEVEL1) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				} else if ((adj->adj_usage == ISIS_ADJ_LEVEL2) ||  					   (adj->adj_usage == @@ -315,7 +315,7 @@ static int process_p2p_hello(struct iih_info *iih)  			case IS_LEVEL_2:  				if (adj->adj_state != ISIS_ADJ_UP  				    || adj->adj_usage == ISIS_ADJ_LEVEL2) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				} else if ((adj->adj_usage == ISIS_ADJ_LEVEL1) ||  					   (adj->adj_usage == @@ -329,7 +329,7 @@ static int process_p2p_hello(struct iih_info *iih)  			case IS_LEVEL_1_AND_2:  				if (adj->adj_state != ISIS_ADJ_UP  				    || adj->adj_usage == ISIS_ADJ_LEVEL1AND2) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				} else if ((adj->adj_usage == ISIS_ADJ_LEVEL1) ||  					   (adj->adj_usage == ISIS_ADJ_LEVEL2)) { @@ -349,12 +349,12 @@ static int process_p2p_hello(struct iih_info *iih)  				if (adj->adj_state != ISIS_ADJ_UP ||  				    adj->adj_usage == ISIS_ADJ_LEVEL2 ||  				    adj->adj_usage == ISIS_ADJ_LEVEL1AND2) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				}  				break;  			case IS_LEVEL_2: -				isis_adj_process_threeway(adj, tw_adj, +				isis_adj_process_threeway(&adj, tw_adj,  							  iih->calculated_type);  				break;  			} @@ -401,7 +401,7 @@ static int process_p2p_hello(struct iih_info *iih)  			case IS_LEVEL_2:  				if (adj->adj_state != ISIS_ADJ_UP  				    || adj->adj_usage == ISIS_ADJ_LEVEL2) { -					isis_adj_process_threeway(adj, tw_adj, +					isis_adj_process_threeway(&adj, tw_adj,  								  iih->calculated_type);  				} else if (adj->adj_usage == ISIS_ADJ_LEVEL1) {  					/* (7) down - wrong system */  | 
