summaryrefslogtreecommitdiffstats
path: root/zebra/zebra_gr.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2020-02-19 22:43:57 +0100
committerQuentin Young <qlyoung@cumulusnetworks.com>2020-02-20 03:38:23 +0100
commita093ad856912effc00779f37b7f5004241d21976 (patch)
treeae99fd3bcd56f1658c8d0c1e81035148b1e3fddc /zebra/zebra_gr.c
parentMerge pull request #5826 from mjstapp/fix_cli_pfx_doc (diff)
downloadfrr-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.c25
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;
}