• C
    perf script: Fix segfault when printing callchains · e557b674
    Chris Phlipot 提交于
    This fixes a bug caused by an unitialized callchain cursor. The crash
    frist appeared in:
    
    6f736735 ("perf evsel: Require that callchains be resolved before
    calling fprintf_{sym,callchain}")
    
    The callchain cursor is a struct that contains pointers, that when
    uninitialized will cause unpredictable behavior (usually a crash)
    when trying to append to the callchain.
    
    The existing implementation has the following issues:
    
    1. The callchain cursor used is not initialized, resulting in
    	unpredictable behavior when used.
    2. The cursor is declared on the stack. Even if it is properly initalized,
    	the implmentation will leak memory when the function returns,
    	since all the references to the callchain_nodes allocated by
    	callchain_cursor_append will be lost when the cursor goes out of
    	scope.
    3. Storing the cursor on the stack is inefficient. Even if memory is
    	properly freed when it goes out of scope, a performance penalty
    	will be incurred due to reallocation of callchain nodes.
    	callchain_cursor_append is designed to avoid these reallocations
    	when an existing cursor is reused.
    
    This patch fixes the crash by replacing cursor_callchain with a reference
    to the global callchain_cursor which also resolves all 3 issues mentioned
    above.
    
    How to reproduce the crash:
    
      $ perf record --call-graph=dwarf stress -t 1 -c 1
      $ perf script > /dev/null
      Segfault
    Signed-off-by: NChris Phlipot <cphlipot0@gmail.com>
    Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Fixes: 6f736735 ("perf evsel: Require that callchains be resolved before calling fprintf_{sym,callchain}")
    Link: http://lkml.kernel.org/r/1461119531-2529-1-git-send-email-cphlipot0@gmail.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    e557b674
builtin-script.c 57.8 KB