]> www.infradead.org Git - users/hch/misc.git/commitdiff
perf tools kwork: Add missed memory allocation check and free
authorDapeng Mi <dapeng1.mi@linux.intel.com>
Fri, 19 Sep 2025 02:16:55 +0000 (10:16 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 2 Oct 2025 18:30:30 +0000 (15:30 -0300)
Same with previous builtin-kvm code, perf_kwork__record() doesn't check
the memory allocation and explicitly free the allocated memory. Just fix
it.

Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-kwork.c

index d2e08de5976d63e99b14d7cdd4eb061cde77f729..7f3068264568ceea64b99de20fa5a305328d67f9 100644 (file)
@@ -2273,12 +2273,23 @@ static void setup_event_list(struct perf_kwork *kwork,
        pr_debug("\n");
 }
 
+#define STRDUP_FAIL_EXIT(s)            \
+       ({      char *_p;               \
+               _p = strdup(s);         \
+               if (!_p) {              \
+                       ret = -ENOMEM;  \
+                       goto EXIT;      \
+               }                       \
+               _p;                     \
+       })
+
 static int perf_kwork__record(struct perf_kwork *kwork,
                              int argc, const char **argv)
 {
        const char **rec_argv;
        unsigned int rec_argc, i, j;
        struct kwork_class *class;
+       int ret;
 
        const char *const record_args[] = {
                "record",
@@ -2298,17 +2309,17 @@ static int perf_kwork__record(struct perf_kwork *kwork,
                return -ENOMEM;
 
        for (i = 0; i < ARRAY_SIZE(record_args); i++)
-               rec_argv[i] = strdup(record_args[i]);
+               rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]);
 
        list_for_each_entry(class, &kwork->class_list, list) {
                for (j = 0; j < class->nr_tracepoints; j++) {
-                       rec_argv[i++] = strdup("-e");
-                       rec_argv[i++] = strdup(class->tp_handlers[j].name);
+                       rec_argv[i++] = STRDUP_FAIL_EXIT("-e");
+                       rec_argv[i++] = STRDUP_FAIL_EXIT(class->tp_handlers[j].name);
                }
        }
 
        for (j = 1; j < (unsigned int)argc; j++, i++)
-               rec_argv[i] = argv[j];
+               rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
 
        BUG_ON(i != rec_argc);
 
@@ -2317,7 +2328,13 @@ static int perf_kwork__record(struct perf_kwork *kwork,
                pr_debug("%s ", rec_argv[j]);
        pr_debug("\n");
 
-       return cmd_record(i, rec_argv);
+       ret = cmd_record(i, rec_argv);
+
+EXIT:
+       for (i = 0; i < rec_argc; i++)
+               free((void *)rec_argv[i]);
+       free(rec_argv);
+       return ret;
 }
 
 int cmd_kwork(int argc, const char **argv)