Skip to content

Commit

Permalink
lib: Free Temporary Memory for AF_FLOWSPEC Prefix
Browse files Browse the repository at this point in the history
This commit addresses a leak where temporary memory allocated
earlier by the `prefix_copy` function for AF_FLOWSPEC prefixes
was not being freed. To ensure proper memory management, we now
release this temporary memory by calling `prefix_flowspec_ptr_free`.

The ASan leak log for reference:

```
***********************************************************************************
Address Sanitizer Error detected in bgp_flowspec.test_bgp_flowspec_topo/r1.asan.bgpd.11539

=================================================================
==11539==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 56 byte(s) in 2 object(s) allocated from:
    #0 0x7feaa956ad28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
    #1 0x7feaa8f670da in qcalloc lib/memory.c:105
    #2 0x7feaa8fac1d4 in prefix_copy lib/prefix.c:346
    #3 0x7feaa8ff43e8 in route_node_get lib/table.c:274
    #4 0x56247cc798c0 in bgp_node_get bgpd/bgp_table.h:236
    #5 0x56247cc798c0 in bgp_afi_node_get bgpd/bgp_route.c:145
    #6 0x56247cc92622 in bgp_update bgpd/bgp_route.c:4188
    #7 0x56247ce55b21 in bgp_nlri_parse_flowspec bgpd/bgp_flowspec.c:193
    #8 0x56247cc4cdd8 in bgp_nlri_parse bgpd/bgp_packet.c:350
    #9 0x56247cc4f37c in bgp_update_receive bgpd/bgp_packet.c:2153
    #10 0x56247cc591e2 in bgp_process_packet bgpd/bgp_packet.c:3214
    #11 0x7feaa9005b99 in event_call lib/event.c:1979
    #12 0x7feaa8f4a379 in frr_run lib/libfrr.c:1213
    #13 0x56247cb51b21 in main bgpd/bgp_main.c:510
    #14 0x7feaa7f8dc86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)

SUMMARY: AddressSanitizer: 56 byte(s) leaked in 2 allocation(s).
***********************************************************************************
```

Signed-off-by: Keelan Cannoo <[email protected]>
  • Loading branch information
Keelan10 committed Oct 4, 2023
1 parent 4523458 commit bc7a0d3
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 0 deletions.
11 changes: 11 additions & 0 deletions lib/prefix.c
Original file line number Diff line number Diff line change
Expand Up @@ -1304,6 +1304,17 @@ void prefix_linkstate_ptr_free(struct prefix *p)
p->u.prefix_linkstate.ptr = (uintptr_t)NULL;
}

void prefix_flowspec_ptr_free(struct prefix *p)
{
void *temp;

if (!p || p->family != AF_FLOWSPEC || !p->u.prefix_flowspec.ptr)
return;

temp = (void *)p->u.prefix_flowspec.ptr;
XFREE(MTYPE_PREFIX_FLOWSPEC, temp);
p->u.prefix_flowspec.ptr = (uintptr_t)NULL;
}

struct prefix *prefix_new(void)
{
Expand Down
1 change: 1 addition & 0 deletions lib/prefix.h
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,7 @@ static inline afi_t prefix_afi(union prefixconstptr pu)
extern unsigned int prefix_bit(const uint8_t *prefix, const uint16_t bit_index);

extern void prefix_linkstate_ptr_free(struct prefix *p);
extern void prefix_flowspec_ptr_free(struct prefix *p);

extern struct prefix *prefix_new(void);
extern void prefix_free(struct prefix **p);
Expand Down
2 changes: 2 additions & 0 deletions lib/table.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,8 @@ struct route_node *route_node_get(struct route_table *table,

if (family2afi(p->family) == AFI_LINKSTATE)
prefix_linkstate_ptr_free(p);
else if (p->family == AF_FLOWSPEC)
prefix_flowspec_ptr_free(p);

return new;
}
Expand Down

0 comments on commit bc7a0d3

Please sign in to comment.