mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
perf tools kwork: Add missed memory allocation check and free
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>
This commit is contained in:
parent
9262fa242b
commit
6f58cf1045
1 changed files with 22 additions and 5 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue