Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Dapeng Mi and committed by
Arnaldo Carvalho de Melo
6f58cf10 9262fa24

+22 -5
+22 -5
tools/perf/builtin-kwork.c
··· 2273 2273 pr_debug("\n"); 2274 2274 } 2275 2275 2276 + #define STRDUP_FAIL_EXIT(s) \ 2277 + ({ char *_p; \ 2278 + _p = strdup(s); \ 2279 + if (!_p) { \ 2280 + ret = -ENOMEM; \ 2281 + goto EXIT; \ 2282 + } \ 2283 + _p; \ 2284 + }) 2285 + 2276 2286 static int perf_kwork__record(struct perf_kwork *kwork, 2277 2287 int argc, const char **argv) 2278 2288 { 2279 2289 const char **rec_argv; 2280 2290 unsigned int rec_argc, i, j; 2281 2291 struct kwork_class *class; 2292 + int ret; 2282 2293 2283 2294 const char *const record_args[] = { 2284 2295 "record", ··· 2309 2298 return -ENOMEM; 2310 2299 2311 2300 for (i = 0; i < ARRAY_SIZE(record_args); i++) 2312 - rec_argv[i] = strdup(record_args[i]); 2301 + rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]); 2313 2302 2314 2303 list_for_each_entry(class, &kwork->class_list, list) { 2315 2304 for (j = 0; j < class->nr_tracepoints; j++) { 2316 - rec_argv[i++] = strdup("-e"); 2317 - rec_argv[i++] = strdup(class->tp_handlers[j].name); 2305 + rec_argv[i++] = STRDUP_FAIL_EXIT("-e"); 2306 + rec_argv[i++] = STRDUP_FAIL_EXIT(class->tp_handlers[j].name); 2318 2307 } 2319 2308 } 2320 2309 2321 2310 for (j = 1; j < (unsigned int)argc; j++, i++) 2322 - rec_argv[i] = argv[j]; 2311 + rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]); 2323 2312 2324 2313 BUG_ON(i != rec_argc); 2325 2314 ··· 2328 2317 pr_debug("%s ", rec_argv[j]); 2329 2318 pr_debug("\n"); 2330 2319 2331 - return cmd_record(i, rec_argv); 2320 + ret = cmd_record(i, rec_argv); 2321 + 2322 + EXIT: 2323 + for (i = 0; i < rec_argc; i++) 2324 + free((void *)rec_argv[i]); 2325 + free(rec_argv); 2326 + return ret; 2332 2327 } 2333 2328 2334 2329 int cmd_kwork(int argc, const char **argv)