perf trace: Use zfree() to reduce chances of use after free
authorArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 12 Apr 2023 12:50:08 +0000 (09:50 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 19 Sep 2023 10:27:59 +0000 (12:27 +0200)
[ Upstream commit 9997d5dd177c52017fa0541bf236a4232c8148e6 ]

Do defensive programming by using zfree() to initialize freed pointers
to NULL, so that eventual use after free result in a NULL pointer deref
instead of more subtle behaviour.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Stable-dep-of: 7962ef13651a ("perf trace: Really free the evsel->priv area")
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/perf/builtin-trace.c

index 97b17f8..6392fcf 100644 (file)
@@ -2293,7 +2293,7 @@ static void syscall__exit(struct syscall *sc)
        if (!sc)
                return;
 
-       free(sc->arg_fmt);
+       zfree(&sc->arg_fmt);
 }
 
 static int trace__sys_enter(struct trace *trace, struct evsel *evsel,
@@ -3129,7 +3129,7 @@ static void evlist__free_syscall_tp_fields(struct evlist *evlist)
                if (!et || !evsel->tp_format || strcmp(evsel->tp_format->system, "syscalls"))
                        continue;
 
-               free(et->fmt);
+               zfree(&et->fmt);
                free(et);
        }
 }
@@ -4765,11 +4765,11 @@ static void trace__exit(struct trace *trace)
        int i;
 
        strlist__delete(trace->ev_qualifier);
-       free(trace->ev_qualifier_ids.entries);
+       zfree(&trace->ev_qualifier_ids.entries);
        if (trace->syscalls.table) {
                for (i = 0; i <= trace->sctbl->syscalls.max_id; i++)
                        syscall__exit(&trace->syscalls.table[i]);
-               free(trace->syscalls.table);
+               zfree(&trace->syscalls.table);
        }
        syscalltbl__delete(trace->sctbl);
        zfree(&trace->perfconfig_events);