Merge tag 'perf-tools-fixes-for-v5.12-2021-04-25' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux

Pull perf tools fixes from Arnaldo Carvalho de Melo:

- Fix potential NULL pointer dereference in the auxtrace option parser

- Fix access to PID in an array when setting a PID filter in 'perf ftrace'

- Fix error return code in the 'perf data' tool and in maps__clone(),
found using a static analysis tool from Huawei

* tag 'perf-tools-fixes-for-v5.12-2021-04-25' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux:
perf map: Fix error return code in maps__clone()
perf ftrace: Fix access to pid in array when setting a pid filter
perf auxtrace: Fix potential NULL pointer dereference
perf data: Fix error return code in perf_data__create_dir()

Changed files
+10 -6
tools
+1 -1
tools/perf/builtin-ftrace.c
··· 289 289 290 290 for (i = 0; i < perf_thread_map__nr(ftrace->evlist->core.threads); i++) { 291 291 scnprintf(buf, sizeof(buf), "%d", 292 - ftrace->evlist->core.threads->map[i]); 292 + perf_thread_map__pid(ftrace->evlist->core.threads, i)); 293 293 if (append_tracing_file("set_ftrace_pid", buf) < 0) 294 294 return -1; 295 295 }
+1 -1
tools/perf/util/auxtrace.c
··· 634 634 break; 635 635 } 636 636 637 - if (itr) 637 + if (itr && itr->parse_snapshot_options) 638 638 return itr->parse_snapshot_options(itr, opts, str); 639 639 640 640 pr_err("No AUX area tracing to snapshot\n");
+3 -2
tools/perf/util/data.c
··· 35 35 int perf_data__create_dir(struct perf_data *data, int nr) 36 36 { 37 37 struct perf_data_file *files = NULL; 38 - int i, ret = -1; 38 + int i, ret; 39 39 40 40 if (WARN_ON(!data->is_dir)) 41 41 return -EINVAL; ··· 51 51 for (i = 0; i < nr; i++) { 52 52 struct perf_data_file *file = &files[i]; 53 53 54 - if (asprintf(&file->path, "%s/data.%d", data->path, i) < 0) 54 + ret = asprintf(&file->path, "%s/data.%d", data->path, i); 55 + if (ret < 0) 55 56 goto out_err; 56 57 57 58 ret = open(file->path, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
+5 -2
tools/perf/util/map.c
··· 840 840 int maps__clone(struct thread *thread, struct maps *parent) 841 841 { 842 842 struct maps *maps = thread->maps; 843 - int err = -ENOMEM; 843 + int err; 844 844 struct map *map; 845 845 846 846 down_read(&parent->lock); 847 847 848 848 maps__for_each_entry(parent, map) { 849 849 struct map *new = map__clone(map); 850 - if (new == NULL) 850 + 851 + if (new == NULL) { 852 + err = -ENOMEM; 851 853 goto out_unlock; 854 + } 852 855 853 856 err = unwind__prepare_access(maps, new, NULL); 854 857 if (err)