Skip to content

Commit

Permalink
perf tools: Fix segfault for symbol annotation on TUI
Browse files Browse the repository at this point in the history
Currently the symbol structure is allocated with symbol_conf.priv_size
to carry sideband information like annotation, map browser on TUI and
sort-by-name tree node.  So retrieving these information from symbol
needs to care about the details of such placement.

However the annotation code just assumes that the symbol is placed after
the struct annotation.  But actually there's other info between them.
So accessing those struct will lead to an undefined behavior (usually a
crash) after they write their info to the same location.

To reproduce the problem, please follow the steps below:

  1. run perf report (TUI of course) with -v option
  2. open map browser (by pressing right arrow key for any entry)
  3. search any function (by pressing '/' key and input whatever..)
  4. return to the hist browser (by pressing 'q' or left arrow key)
  5. open annotation window for the same entry (by pressing 'a' key)

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1421234288-22758-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Namhyung Kim authored and Arnaldo Carvalho de Melo committed Jan 16, 2015
1 parent b93b096 commit 813ccd1
Showing 1 changed file with 1 addition and 7 deletions.
8 changes: 1 addition & 7 deletions tools/perf/util/annotate.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,6 @@ struct annotation {
struct annotated_source *src;
};

struct sannotation {
struct annotation annotation;
struct symbol symbol;
};

static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
{
return (((void *)&notes->src->histograms) +
Expand All @@ -129,8 +124,7 @@ static inline struct sym_hist *annotation__histogram(struct annotation *notes, i

static inline struct annotation *symbol__annotation(struct symbol *sym)
{
struct sannotation *a = container_of(sym, struct sannotation, symbol);
return &a->annotation;
return (void *)sym - symbol_conf.priv_size;
}

int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx);
Expand Down

0 comments on commit 813ccd1

Please sign in to comment.