diff options
| author | Sander Vrijders <sander.vrijders@ugent.be> | 2018-05-04 11:53:15 +0200 |
|---|---|---|
| committer | Dimitri Staessens <dimitri.staessens@ugent.be> | 2018-05-04 12:11:17 +0200 |
| commit | 7d6fabc5bfb227ed76376a68a820aa243b0d7f53 (patch) | |
| tree | dc0cf9ba54bbbf1d482fd8fc5cefd40612b5b0ea | |
| parent | e92174e887bac9b18a6b5d18e04adaefd3bd4bc1 (diff) | |
| download | ouroboros-7d6fabc5bfb227ed76376a68a820aa243b0d7f53.zip ouroboros-7d6fabc5bfb227ed76376a68a820aa243b0d7f53.tar.gz | |
ipcpd: Fix bad memory handling in LFA policy
The Loop-Free Alternates policy had bad memory management in two
places. In the calculation of the LFAs a table was freed in the first
iteration of a loop, whereas it was still needed in the other
iterations. It is now freed outside of the loop. In the alternate PFF
the address structs were not freed upon shutdown, this has been added
as well. It also fixes some bad initialization in the LFA calculation
function.
Signed-off-by: Sander Vrijders <sander.vrijders@ugent.be>
Signed-off-by: Dimitri Staessens <dimitri.staessens@ugent.be>
| -rw-r--r-- | src/ipcpd/normal/pol/alternate_pff.c | 1 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/graph.c | 14 |
2 files changed, 8 insertions, 7 deletions
diff --git a/src/ipcpd/normal/pol/alternate_pff.c b/src/ipcpd/normal/pol/alternate_pff.c index cb438c5..3cb99d9 100644 --- a/src/ipcpd/normal/pol/alternate_pff.c +++ b/src/ipcpd/normal/pol/alternate_pff.c @@ -234,6 +234,7 @@ void alternate_pff_destroy(struct pff_i * pff_i) htable_destroy(pff_i->table); del_nhops_down(pff_i); + del_addrs(pff_i); pthread_rwlock_destroy(&pff_i->lock); free(pff_i); } diff --git a/src/ipcpd/normal/pol/graph.c b/src/ipcpd/normal/pol/graph.c index 41a2720..007e104 100644 --- a/src/ipcpd/normal/pol/graph.c +++ b/src/ipcpd/normal/pol/graph.c @@ -612,9 +612,9 @@ int graph_routing_table_lfa(struct graph * graph, pthread_mutex_lock(&graph->lock); for (j = 0; j < PROG_MAX_FLOWS; j++) { - n_dist[i] = NULL; - n_index[i] = -1; - addrs[i] = -1; + n_dist[j] = NULL; + n_index[j] = -1; + addrs[j] = -1; } /* Get the normal next hops routing table. */ @@ -660,17 +660,17 @@ int graph_routing_table_lfa(struct graph * graph, continue; if (n_dist[j][v->index] < - s_dist[n_index[j]] + s_dist[v->index]) { + s_dist[n_index[j]] + s_dist[v->index]) if (add_lfa_to_table(table, v->addr, addrs[j])) goto fail_add_lfa; - } - - free(n_dist[j]); } } pthread_mutex_unlock(&graph->lock); + for (j = 0; j < i; j++) + free(n_dist[j]); + free(s_dist); return 0; |
