perf probe: Free string returned by synthesize_perf_probe_point() on failure in synth...
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 4 Aug 2023 16:18:38 +0000 (13:18 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 7 Aug 2023 19:40:29 +0000 (16:40 -0300)
Building perf with EXTRA_CFLAGS="-fsanitize=address" a leak was detected
elsewhere and lead to an audit, where we found that
synthesize_perf_probe_command() may leak synthesize_perf_probe_point()
return on failure, fix it.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/ZM0mzpQktHnhXJXr@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/probe-event.c

index c7bfeab..2835d87 100644 (file)
@@ -2063,14 +2063,18 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev)
                        goto out;
 
        tmp = synthesize_perf_probe_point(&pev->point);
-       if (!tmp || strbuf_addstr(&buf, tmp) < 0)
+       if (!tmp || strbuf_addstr(&buf, tmp) < 0) {
+               free(tmp);
                goto out;
+       }
        free(tmp);
 
        for (i = 0; i < pev->nargs; i++) {
                tmp = synthesize_perf_probe_arg(pev->args + i);
-               if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0)
+               if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0) {
+                       free(tmp);
                        goto out;
+               }
                free(tmp);
        }