perf kmaps: Check kmaps to make code more robust
This patch add checks in places where map__kmap is used to get kmaps from struct kmap. Error messages are added at map__kmap to warn invalid accessing of kmap (for the case of !map->dso->kernel, kmap(map) does not exists at all). Also, introduces map__kmaps() to warn uninitialized kmaps. Reviewed-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Wang Nan <wangnan0@huawei.com> Cc: pi3orama@163.com Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Link: http://lkml.kernel.org/r/1428394966-131044-2-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
8ea92ceb74
commit
ba92732e98
@@ -630,13 +630,16 @@ static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
|
||||
static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
|
||||
symbol_filter_t filter)
|
||||
{
|
||||
struct map_groups *kmaps = map__kmap(map)->kmaps;
|
||||
struct map_groups *kmaps = map__kmaps(map);
|
||||
struct map *curr_map;
|
||||
struct symbol *pos;
|
||||
int count = 0, moved = 0;
|
||||
struct rb_root *root = &dso->symbols[map->type];
|
||||
struct rb_node *next = rb_first(root);
|
||||
|
||||
if (!kmaps)
|
||||
return -1;
|
||||
|
||||
while (next) {
|
||||
char *module;
|
||||
|
||||
@@ -682,8 +685,8 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
|
||||
static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
|
||||
symbol_filter_t filter)
|
||||
{
|
||||
struct map_groups *kmaps = map__kmap(map)->kmaps;
|
||||
struct machine *machine = kmaps->machine;
|
||||
struct map_groups *kmaps = map__kmaps(map);
|
||||
struct machine *machine;
|
||||
struct map *curr_map = map;
|
||||
struct symbol *pos;
|
||||
int count = 0, moved = 0;
|
||||
@@ -691,6 +694,11 @@ static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
|
||||
struct rb_node *next = rb_first(root);
|
||||
int kernel_range = 0;
|
||||
|
||||
if (!kmaps)
|
||||
return -1;
|
||||
|
||||
machine = kmaps->machine;
|
||||
|
||||
while (next) {
|
||||
char *module;
|
||||
|
||||
@@ -1025,9 +1033,12 @@ static bool filename_from_kallsyms_filename(char *filename,
|
||||
static int validate_kcore_modules(const char *kallsyms_filename,
|
||||
struct map *map)
|
||||
{
|
||||
struct map_groups *kmaps = map__kmap(map)->kmaps;
|
||||
struct map_groups *kmaps = map__kmaps(map);
|
||||
char modules_filename[PATH_MAX];
|
||||
|
||||
if (!kmaps)
|
||||
return -EINVAL;
|
||||
|
||||
if (!filename_from_kallsyms_filename(modules_filename, "modules",
|
||||
kallsyms_filename))
|
||||
return -EINVAL;
|
||||
@@ -1043,6 +1054,9 @@ static int validate_kcore_addresses(const char *kallsyms_filename,
|
||||
{
|
||||
struct kmap *kmap = map__kmap(map);
|
||||
|
||||
if (!kmap)
|
||||
return -EINVAL;
|
||||
|
||||
if (kmap->ref_reloc_sym && kmap->ref_reloc_sym->name) {
|
||||
u64 start;
|
||||
|
||||
@@ -1081,8 +1095,8 @@ static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
|
||||
static int dso__load_kcore(struct dso *dso, struct map *map,
|
||||
const char *kallsyms_filename)
|
||||
{
|
||||
struct map_groups *kmaps = map__kmap(map)->kmaps;
|
||||
struct machine *machine = kmaps->machine;
|
||||
struct map_groups *kmaps = map__kmaps(map);
|
||||
struct machine *machine;
|
||||
struct kcore_mapfn_data md;
|
||||
struct map *old_map, *new_map, *replacement_map = NULL;
|
||||
bool is_64_bit;
|
||||
@@ -1090,6 +1104,11 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
|
||||
char kcore_filename[PATH_MAX];
|
||||
struct symbol *sym;
|
||||
|
||||
if (!kmaps)
|
||||
return -EINVAL;
|
||||
|
||||
machine = kmaps->machine;
|
||||
|
||||
/* This function requires that the map is the kernel map */
|
||||
if (map != machine->vmlinux_maps[map->type])
|
||||
return -EINVAL;
|
||||
@@ -1202,6 +1221,9 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)
|
||||
struct kmap *kmap = map__kmap(map);
|
||||
u64 addr;
|
||||
|
||||
if (!kmap)
|
||||
return -1;
|
||||
|
||||
if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->name)
|
||||
return 0;
|
||||
|
||||
|
Reference in New Issue
Block a user