perf trace: Free thread_trace->files table
authorArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 19 Jul 2023 19:49:02 +0000 (16:49 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 20 Jul 2023 14:30:26 +0000 (11:30 -0300)
The fd->pathname table that is kept in 'struct thread_trace' and thus in
thread->priv must be freed when a thread is deleted.

This was also detected using -fsanitize=address.

Acked-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/20230719202951.534582-6-acme@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-trace.c

index 56651d666480cc166c068fb5253010a6e5420c75..7ece2521efb691823e536a1e29e97d881fb37988 100644 (file)
@@ -1296,6 +1296,8 @@ static struct thread_trace *thread_trace__new(void)
        return ttrace;
 }
 
+static void thread_trace__free_files(struct thread_trace *ttrace);
+
 static void thread_trace__delete(void *pttrace)
 {
        struct thread_trace *ttrace = pttrace;
@@ -1305,6 +1307,7 @@ static void thread_trace__delete(void *pttrace)
 
        intlist__delete(ttrace->syscall_stats);
        ttrace->syscall_stats = NULL;
+       thread_trace__free_files(ttrace);
        zfree(&ttrace->entry_str);
        free(ttrace);
 }
@@ -1346,6 +1349,17 @@ void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
 
 static const size_t trace__entry_str_size = 2048;
 
+static void thread_trace__free_files(struct thread_trace *ttrace)
+{
+       for (int i = 0; i < ttrace->files.max; ++i) {
+               struct file *file = ttrace->files.table + i;
+               zfree(&file->pathname);
+       }
+
+       zfree(&ttrace->files.table);
+       ttrace->files.max  = -1;
+}
+
 static struct file *thread_trace__files_entry(struct thread_trace *ttrace, int fd)
 {
        if (fd < 0)