aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Luong <sluong@cisco.com>2020-07-17 09:09:16 -0700
committerOle Trøan <otroan@employees.org>2020-07-21 06:20:08 +0000
commite29fb5bf1b9ab87f4213d990377ea2604990135b (patch)
tree00471bb25c89e0a8853f95fac2f9ddaf3be8d3a2
parent459d17bb7d051566c587c4f963014fdbbe99ff6a (diff)
stats: memory leak in stat_validate_counter_vector
Free the existing vectors prior to losing them. Type: fix Ticket: VPPSUPP-94 Signed-off-by: Steven Luong <sluong@cisco.com> Change-Id: Ic15f1fbc7a0c6c348065fc9759ee5d5c43013b91 Signed-off-by: Ole Troan <ot@cisco.com>
-rw-r--r--src/vpp/stats/stat_segment.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c
index 2152e1e0bfd..8727122cee7 100644
--- a/src/vpp/stats/stat_segment.c
+++ b/src/vpp/stats/stat_segment.c
@@ -295,20 +295,28 @@ stat_validate_counter_vector (stat_segment_directory_entry_t * ep, u32 max)
{
stat_segment_main_t *sm = &stat_segment_main;
stat_segment_shared_header_t *shared_header = sm->shared_header;
- counter_t **counters = 0;
+ counter_t **counters =
+ ep->offset ? stat_segment_pointer (shared_header, ep->offset) : 0;
vlib_thread_main_t *tm = vlib_get_thread_main ();
int i;
u64 *offset_vector = 0;
vec_validate_aligned (counters, tm->n_vlib_mains - 1,
CLIB_CACHE_LINE_BYTES);
+ ep->offset = stat_segment_offset (shared_header, counters);
+
for (i = 0; i < tm->n_vlib_mains; i++)
{
vec_validate_aligned (counters[i], max, CLIB_CACHE_LINE_BYTES);
vec_add1 (offset_vector,
stat_segment_offset (shared_header, counters[i]));
}
- ep->offset = stat_segment_offset (shared_header, counters);
+
+ if (ep->offset_vector)
+ {
+ u64 *p = stat_segment_pointer (sm->shared_header, ep->offset_vector);
+ vec_free (p);
+ }
ep->offset_vector = stat_segment_offset (shared_header, offset_vector);
}