diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2023-11-30 09:22:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-30 09:22:57 +0200 |
| commit | 3ed1bc81be9a018682ce2570aaf6e5d753c72a8c (patch) | |
| tree | 2fa886b345f0aa58455d53d3c666b1f0ff02afe0 | |
| parent | 4aff978cee928cc0f8e1bf68a10d9c6ebb4b270e (diff) | |
| parent | 8e7044ba3b806d286ed964746f4e88004035be09 (diff) | |
Merge pull request #14907 from Keelan10/bgp_srv6-leak
bgpd: Free Memory for SRv6 Functions and Locator Chunks
| -rw-r--r-- | bgpd/bgp_mplsvpn.c | 7 | ||||
| -rw-r--r-- | bgpd/bgp_vty.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 2 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 2 | ||||
| -rw-r--r-- | bgpd/bgpd.h | 3 | ||||
| -rw-r--r-- | lib/srv6.c | 2 | ||||
| -rw-r--r-- | lib/srv6.h | 1 |
7 files changed, 15 insertions, 4 deletions
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 1e25e1b6a7..cf57d95eb0 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -596,6 +596,11 @@ static void sid_register(struct bgp *bgp, const struct in6_addr *sid, listnode_add(bgp->srv6_functions, func); } +void srv6_function_free(struct bgp_srv6_function *func) +{ + XFREE(MTYPE_BGP_SRV6_FUNCTION, func); +} + void sid_unregister(struct bgp *bgp, const struct in6_addr *sid) { struct listnode *node, *nnode; @@ -604,7 +609,7 @@ void sid_unregister(struct bgp *bgp, const struct in6_addr *sid) for (ALL_LIST_ELEMENTS(bgp->srv6_functions, node, nnode, func)) if (sid_same(&func->sid, sid)) { listnode_delete(bgp->srv6_functions, func); - XFREE(MTYPE_BGP_SRV6_FUNCTION, func); + srv6_function_free(func); } } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index e45a5fccb4..4f9e4b4ce9 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -319,7 +319,7 @@ static int bgp_srv6_locator_unset(struct bgp *bgp) /* refresh functions */ for (ALL_LIST_ELEMENTS(bgp->srv6_functions, node, nnode, func)) { listnode_delete(bgp->srv6_functions, func); - XFREE(MTYPE_BGP_SRV6_FUNCTION, func); + srv6_function_free(func); } /* refresh tovpn_sid */ diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 98e21bae09..dfb8d01f2d 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -3213,7 +3213,7 @@ static int bgp_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS) if (prefix_match((struct prefix *)&loc.prefix, (struct prefix *)&tmp_prefi)) { listnode_delete(bgp->srv6_functions, func); - XFREE(MTYPE_BGP_SRV6_FUNCTION, func); + srv6_function_free(func); } } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 8e6de3b4fb..4fa021ab93 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1427,7 +1427,9 @@ static void bgp_srv6_init(struct bgp *bgp) bgp->srv6_enabled = false; memset(bgp->srv6_locator_name, 0, sizeof(bgp->srv6_locator_name)); bgp->srv6_locator_chunks = list_new(); + bgp->srv6_locator_chunks->del = srv6_locator_chunk_list_free; bgp->srv6_functions = list_new(); + bgp->srv6_functions->del = (void (*)(void *))srv6_function_free; } static void bgp_srv6_cleanup(struct bgp *bgp) diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 30877cad06..9e9d1c1e1e 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -2739,6 +2739,9 @@ extern bool bgp_path_attribute_discard(struct peer *peer, char *buf, size_t size); extern bool bgp_path_attribute_treat_as_withdraw(struct peer *peer, char *buf, size_t size); + +extern void srv6_function_free(struct bgp_srv6_function *func); + #ifdef _FRR_ATTRIBUTE_PRINTFRR /* clang-format off */ #pragma FRR printfrr_ext "%pBP" (struct peer *) diff --git a/lib/srv6.c b/lib/srv6.c index 09835f3ea8..dceb6ab48b 100644 --- a/lib/srv6.c +++ b/lib/srv6.c @@ -108,7 +108,7 @@ const char *seg6local_context2str(char *str, size_t size, } } -static void srv6_locator_chunk_list_free(void *data) +void srv6_locator_chunk_list_free(void *data) { struct srv6_locator_chunk *chunk = data; diff --git a/lib/srv6.h b/lib/srv6.h index fb34f861c8..433c5c14fd 100644 --- a/lib/srv6.h +++ b/lib/srv6.h @@ -252,6 +252,7 @@ int snprintf_seg6_segs(char *str, extern struct srv6_locator *srv6_locator_alloc(const char *name); extern struct srv6_locator_chunk *srv6_locator_chunk_alloc(void); extern void srv6_locator_free(struct srv6_locator *locator); +extern void srv6_locator_chunk_list_free(void *data); extern void srv6_locator_chunk_free(struct srv6_locator_chunk **chunk); json_object *srv6_locator_chunk_json(const struct srv6_locator_chunk *chunk); json_object *srv6_locator_json(const struct srv6_locator *loc); |
