Commit 39a27325 authored by Ian Rogers's avatar Ian Rogers Committed by Namhyung Kim

perf maps: Get map before returning in maps__find_next_entry

Finding a map is done under a lock, returning the map without a
reference count means it can be removed without notice and causing
uses after free. Grab a reference count to the map within the lock
region and return this. Fix up locations that need a map__put
following this.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: James Clark <james.clark@arm.com>
Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Song Liu <song@kernel.org>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Artem Savkov <asavkov@redhat.com>
Cc: bpf@vger.kernel.org
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240210031746.4057262-5-irogers@google.com
parent 107ef66c
...@@ -1761,8 +1761,10 @@ int machine__create_kernel_maps(struct machine *machine) ...@@ -1761,8 +1761,10 @@ int machine__create_kernel_maps(struct machine *machine)
struct map *next = maps__find_next_entry(machine__kernel_maps(machine), struct map *next = maps__find_next_entry(machine__kernel_maps(machine),
machine__kernel_map(machine)); machine__kernel_map(machine));
if (next) if (next) {
machine__set_kernel_mmap(machine, start, map__start(next)); machine__set_kernel_mmap(machine, start, map__start(next));
map__put(next);
}
} }
out_put: out_put:
......
...@@ -962,7 +962,7 @@ struct map *maps__find_next_entry(struct maps *maps, struct map *map) ...@@ -962,7 +962,7 @@ struct map *maps__find_next_entry(struct maps *maps, struct map *map)
down_read(maps__lock(maps)); down_read(maps__lock(maps));
i = maps__by_address_index(maps, map); i = maps__by_address_index(maps, map);
if (i < maps__nr_maps(maps)) if (i < maps__nr_maps(maps))
result = maps__maps_by_address(maps)[i]; // TODO: map__get result = map__get(maps__maps_by_address(maps)[i]);
up_read(maps__lock(maps)); up_read(maps__lock(maps));
return result; return result;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment