diff options
author | Quentin Young <qlyoung@cumulusnetworks.com> | 2020-02-19 22:43:57 +0100 |
---|---|---|
committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2020-02-20 03:38:23 +0100 |
commit | a093ad856912effc00779f37b7f5004241d21976 (patch) | |
tree | ae99fd3bcd56f1658c8d0c1e81035148b1e3fddc /zebra/zebra_gr.c | |
parent | Merge pull request #5826 from mjstapp/fix_cli_pfx_doc (diff) | |
download | frr-a093ad856912effc00779f37b7f5004241d21976.tar.xz frr-a093ad856912effc00779f37b7f5004241d21976.zip |
zebra: reduce scope of XCALLOC for gr processing
Somewhat gnarly code flow here that might be leaking memory - can't tell
if it's a test artifact or not, but in any case this reduces the
situations in which we need to alloc a block.
And we don't need to check XCALLOC for success...
And we don't need to null check before XFREE...
Or set XFREE'd pointers to NULL...
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'zebra/zebra_gr.c')
-rw-r--r-- | zebra/zebra_gr.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/zebra/zebra_gr.c b/zebra/zebra_gr.c index e8c7304f4..5b889c3c0 100644 --- a/zebra/zebra_gr.c +++ b/zebra/zebra_gr.c @@ -516,7 +516,6 @@ static int32_t zebra_gr_delete_stale_route(struct client_gr_info *info, struct route_entry *next; struct route_table *table; int32_t n = 0; - struct prefix *p; afi_t afi, curr_afi; uint8_t proto; uint16_t instance; @@ -541,25 +540,21 @@ static int32_t zebra_gr_delete_stale_route(struct client_gr_info *info, /* Process routes for all AFI */ for (afi = curr_afi; afi < AFI_MAX; afi++) { table = zvrf->table[afi][SAFI_UNICAST]; - p = info->current_prefix; if (table) { /* * If the current prefix is NULL then get the first * route entry in the table */ - if (p == NULL) { + if (info->current_prefix == NULL) { rn = route_top(table); if (rn == NULL) continue; - p = XCALLOC(MTYPE_TMP, sizeof(struct prefix)); - if (p == NULL) - return -1; curr = rn; - prefix_copy(p, &rn->p); } else /* Get the next route entry */ - curr = route_table_get_next(table, p); + curr = route_table_get_next( + table, info->current_prefix); for (rn = curr; rn; rn = srcdest_route_next(rn)) { RNODE_FOREACH_RE_SAFE (rn, re, next) { @@ -583,9 +578,13 @@ static int32_t zebra_gr_delete_stale_route(struct client_gr_info *info, */ if ((n >= ZEBRA_MAX_STALE_ROUTE_COUNT) && (info->delete == false)) { - prefix_copy(p, &rn->p); info->current_afi = afi; - info->current_prefix = p; + info->current_prefix = XCALLOC( + MTYPE_TMP, + sizeof(struct prefix)); + prefix_copy( + info->current_prefix, + &rn->p); return n; } } @@ -595,11 +594,7 @@ static int32_t zebra_gr_delete_stale_route(struct client_gr_info *info, * Reset the current prefix to indicate processing completion * of the current AFI */ - if (info->current_prefix) { - XFREE(MTYPE_TMP, info->current_prefix); - info->current_prefix = NULL; - } - continue; + XFREE(MTYPE_TMP, info->current_prefix); } return 0; } |