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()
Unified · Split
| @@ -289,7 +289,7 @@ static int set_tracing_pid(struct perf_ftrace *ftrace) · 288 unmodified lines | |||
| 289 | 289 | ||
| 290 | for (i = 0; i < perf_thread_map__nr(ftrace->evlist->core.threads); i++) { | 290 | for (i = 0; i < perf_thread_map__nr(ftrace->evlist->core.threads); i++) { |
| 291 | scnprintf(buf, sizeof(buf), "%d", | 291 | scnprintf(buf, sizeof(buf), "%d", |
| 292 | ftrace->evlist->core.threads->map[i]); | 292 | perf_thread_map__pid(ftrace->evlist->core.threads, i)); |
| 293 | if (append_tracing_file("set_ftrace_pid", buf) < 0) | 293 | if (append_tracing_file("set_ftrace_pid", buf) < 0) |
| 294 | return -1; | 294 | return -1; |
| 295 | } | 295 | } |
| @@ -634,7 +634,7 @@ int auxtrace_parse_snapshot_options(struct auxtrace_record *itr, · 633 unmodified lines | |||
| 634 | break; | 634 | break; |
| 635 | } | 635 | } |
| 636 | 636 | ||
| 637 | if (itr) | 637 | if (itr && itr->parse_snapshot_options) |
| 638 | return itr->parse_snapshot_options(itr, opts, str); | 638 | return itr->parse_snapshot_options(itr, opts, str); |
| 639 | 639 | ||
| 640 | pr_err("No AUX area tracing to snapshot\n"); | 640 | pr_err("No AUX area tracing to snapshot\n"); |
| @@ -35,7 +35,7 @@ void perf_data__close_dir(struct perf_data *data) · 34 unmodified lines | |||
| 35 | int perf_data__create_dir(struct perf_data *data, int nr) | 35 | int perf_data__create_dir(struct perf_data *data, int nr) |
| 36 | { | 36 | { |
| 37 | struct perf_data_file *files = NULL; | 37 | struct perf_data_file *files = NULL; |
| 38 | int i, ret = -1; | 38 | int i, ret; |
| 39 | 39 | ||
| 40 | if (WARN_ON(!data->is_dir)) | 40 | if (WARN_ON(!data->is_dir)) |
| 41 | return -EINVAL; | 41 | return -EINVAL; |
| @@ -51,7 +51,8 @@ int perf_data__create_dir(struct perf_data *data, int nr) · 9 unmodified lines | |||
| 51 | for (i = 0; i < nr; i++) { | 51 | for (i = 0; i < nr; i++) { |
| 52 | struct perf_data_file *file = &files[i]; | 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 | goto out_err; | 56 | goto out_err; |
| 56 | 57 | ||
| 57 | ret = open(file->path, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); | 58 | ret = open(file->path, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); |
| @@ -840,15 +840,18 @@ out: · 839 unmodified lines | |||
| 840 | int maps__clone(struct thread *thread, struct maps *parent) | 840 | int maps__clone(struct thread *thread, struct maps *parent) |
| 841 | { | 841 | { |
| 842 | struct maps *maps = thread->maps; | 842 | struct maps *maps = thread->maps; |
| 843 | int err = -ENOMEM; | 843 | int err; |
| 844 | struct map *map; | 844 | struct map *map; |
| 845 | 845 | ||
| 846 | down_read(&parent->lock); | 846 | down_read(&parent->lock); |
| 847 | 847 | ||
| 848 | maps__for_each_entry(parent, map) { | 848 | maps__for_each_entry(parent, map) { |
| 849 | struct map *new = map__clone(map); | 849 | struct map *new = map__clone(map); |
| 850 | if (new == NULL) | 850 | |
| 851 | if (new == NULL) { | ||
| 852 | err = -ENOMEM; | ||
| 851 | goto out_unlock; | 853 | goto out_unlock; |
| 854 | } | ||
| 852 | 855 | ||
| 853 | err = unwind__prepare_access(maps, new, NULL); | 856 | err = unwind__prepare_access(maps, new, NULL); |
| 854 | if (err) | 857 | if (err) |