diff options
author | Carmine Scarpitta <carmine.scarpitta@uniroma2.it> | 2022-08-24 00:35:43 +0200 |
---|---|---|
committer | Carmine Scarpitta <carmine.scarpitta@uniroma2.it> | 2022-08-24 14:22:04 +0200 |
commit | 6dece5ac29320c720e2f79ca0f52ebdad7615fc8 (patch) | |
tree | fa62afad37ae846be5205b8c206f9a5b451cae23 /sharpd | |
parent | sharpd: Fix memory leak in release-locator-chunk (diff) | |
download | frr-6dece5ac29320c720e2f79ca0f52ebdad7615fc8.tar.xz frr-6dece5ac29320c720e2f79ca0f52ebdad7615fc8.zip |
sharpd: Fix memory leak in release-locator-chunk
Running the `zebra_seg6local_route` topotest with `--valgrind-memleaks`
gives several memory leak errors. This is due to the way SRv6 chunks are
released: when the user executes the CLI command
`sharp srv6-manager release-locator-chunk` to release the chunks of an
SRv6 locator, the `list_delete()` function is called to delete the
chunks list (`loc->chunks`), but the memory allocated for the chunks is
not freed.
This patch defines a new callback `sharp_srv6_locator_chunk_free()`.
This callback takes care of freeing the memory allocated for a given
chunk. When `list_delete()` is called to remove the chunk list
`loc->chunks`, it automatically calls `sharp_srv6_locator_chunk_free()`
on each element of the list to free the allocated memory before
deleting the list.
Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to 'sharpd')
-rw-r--r-- | sharpd/sharp_vty.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sharpd/sharp_vty.c b/sharpd/sharp_vty.c index b3ac8949e..cfde0749b 100644 --- a/sharpd/sharp_vty.c +++ b/sharpd/sharp_vty.c @@ -924,6 +924,11 @@ DEFPY (import_te, return CMD_SUCCESS; } +static void sharp_srv6_locator_chunk_free(struct prefix_ipv6 *chunk) +{ + prefix_ipv6_free((struct prefix_ipv6 **)&chunk); +} + DEFPY (sharp_srv6_manager_get_locator_chunk, sharp_srv6_manager_get_locator_chunk_cmd, "sharp srv6-manager get-locator-chunk NAME$locator_name", @@ -947,6 +952,8 @@ DEFPY (sharp_srv6_manager_get_locator_chunk, loc = XCALLOC(MTYPE_SRV6_LOCATOR, sizeof(struct sharp_srv6_locator)); loc->chunks = list_new(); + loc->chunks->del = + (void (*)(void *))sharp_srv6_locator_chunk_free; snprintf(loc->name, SRV6_LOCNAME_SIZE, "%s", locator_name); listnode_add(sg.srv6_locators, loc); } |