summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-04-23 08:34:47 -0400
committerGitHub <noreply@github.com>2019-04-23 08:34:47 -0400
commitc1f0465a3d15f6e7fc709e5523b3ac7b4f62cfd6 (patch)
treea0658fb38610efe7a7af667686fbf7e5537380bc
parentf799ea3f940dc8107e677f4349fcd542cf01305b (diff)
parentcbcbac457870a9b569104b8250e57f0bd8d55114 (diff)
Merge pull request #4162 from opensourcerouting/rip-issues
ripd, ripngd: fix cleaning up of offset lists
-rw-r--r--lib/if_rmap.c1
-rw-r--r--ripd/rip_offset.c5
-rw-r--r--ripd/ripd.c2
-rw-r--r--ripd/ripd.h1
-rw-r--r--ripngd/ripng_offset.c5
-rw-r--r--ripngd/ripngd.c2
-rw-r--r--ripngd/ripngd.h1
7 files changed, 15 insertions, 2 deletions
diff --git a/lib/if_rmap.c b/lib/if_rmap.c
index d8236b6b25..b0802da961 100644
--- a/lib/if_rmap.c
+++ b/lib/if_rmap.c
@@ -291,6 +291,7 @@ int config_write_if_rmap(struct vty *vty,
void if_rmap_ctx_delete(struct if_rmap_ctx *ctx)
{
+ listnode_delete(if_rmap_ctx_list, ctx);
hash_clean(ctx->ifrmaphash, (void (*)(void *))if_rmap_free);
if (ctx->name)
XFREE(MTYPE_IF_RMAP_CTX_NAME, ctx);
diff --git a/ripd/rip_offset.c b/ripd/rip_offset.c
index b3f84fe50f..8307a95d27 100644
--- a/ripd/rip_offset.c
+++ b/ripd/rip_offset.c
@@ -50,6 +50,11 @@ struct rip_offset_list *rip_offset_list_new(struct rip *rip, const char *ifname)
void offset_list_del(struct rip_offset_list *offset)
{
listnode_delete(offset->rip->offset_list_master, offset);
+ offset_list_free(offset);
+}
+
+void offset_list_free(struct rip_offset_list *offset)
+{
if (OFFSET_LIST_IN_NAME(offset))
free(OFFSET_LIST_IN_NAME(offset));
if (OFFSET_LIST_OUT_NAME(offset))
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 201de9a46e..3a1ffd17a6 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -2712,7 +2712,7 @@ struct rip *rip_create(const char *vrf_name, struct vrf *vrf, int socket)
rip->passive_nondefault = vector_init(1);
rip->offset_list_master = list_new();
rip->offset_list_master->cmp = (int (*)(void *, void *))offset_list_cmp;
- rip->offset_list_master->del = (void (*)(void *))offset_list_del;
+ rip->offset_list_master->del = (void (*)(void *))offset_list_free;
/* Distribute list install. */
rip->distribute_ctx = distribute_list_ctx_create(vrf);
diff --git a/ripd/ripd.h b/ripd/ripd.h
index 7b196a16be..44f5932fb6 100644
--- a/ripd/ripd.h
+++ b/ripd/ripd.h
@@ -507,6 +507,7 @@ extern struct rip_info *rip_ecmp_delete(struct rip *rip,
extern struct rip_offset_list *rip_offset_list_new(struct rip *rip,
const char *ifname);
extern void offset_list_del(struct rip_offset_list *offset);
+extern void offset_list_free(struct rip_offset_list *offset);
extern struct rip_offset_list *rip_offset_list_lookup(struct rip *rip,
const char *ifname);
extern int rip_offset_list_apply_in(struct prefix_ipv4 *, struct interface *,
diff --git a/ripngd/ripng_offset.c b/ripngd/ripng_offset.c
index 41ba2360ba..fe95ccfc2b 100644
--- a/ripngd/ripng_offset.c
+++ b/ripngd/ripng_offset.c
@@ -56,6 +56,11 @@ struct ripng_offset_list *ripng_offset_list_new(struct ripng *ripng,
void ripng_offset_list_del(struct ripng_offset_list *offset)
{
listnode_delete(offset->ripng->offset_list_master, offset);
+ ripng_offset_list_free(offset);
+}
+
+void ripng_offset_list_free(struct ripng_offset_list *offset)
+{
if (OFFSET_LIST_IN_NAME(offset))
free(OFFSET_LIST_IN_NAME(offset));
if (OFFSET_LIST_OUT_NAME(offset))
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index b36cee2c5d..411689a7a7 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -1889,7 +1889,7 @@ struct ripng *ripng_create(const char *vrf_name, struct vrf *vrf, int socket)
ripng->offset_list_master->cmp =
(int (*)(void *, void *))offset_list_cmp;
ripng->offset_list_master->del =
- (void (*)(void *))ripng_offset_list_del;
+ (void (*)(void *))ripng_offset_list_free;
ripng->distribute_ctx = distribute_list_ctx_create(vrf);
distribute_list_add_hook(ripng->distribute_ctx,
ripng_distribute_update);
diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h
index dcc61ae58a..dc425b6958 100644
--- a/ripngd/ripngd.h
+++ b/ripngd/ripngd.h
@@ -421,6 +421,7 @@ extern void ripng_peer_list_del(void *arg);
extern struct ripng_offset_list *ripng_offset_list_new(struct ripng *ripng,
const char *ifname);
extern void ripng_offset_list_del(struct ripng_offset_list *offset);
+extern void ripng_offset_list_free(struct ripng_offset_list *offset);
extern struct ripng_offset_list *ripng_offset_list_lookup(struct ripng *ripng,
const char *ifname);
extern int ripng_offset_list_apply_in(struct ripng *ripng,