• Adrian Hunter's avatar
    perf annotate: Fix objdump line parsing offset validation · 886b37ba
    Adrian Hunter authored
    When parsing lines from objdump a line containing source code starting
    with a numeric label is mistaken for a line of disassembly starting with
    a memory address.
    
    Current validation fails to recognise that the "memory address" is out
    of range and calculates an invalid offset which later causes this
    segfault:
    
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000457315 in disasm__calc_percent (notes=0xc98970, evidx=0, offset=143705, end=2127526177, path=0x7fffffffbf50)
        at util/annotate.c:631
    631				hits += h->addr[offset++];
    (gdb) bt
     #0  0x0000000000457315 in disasm__calc_percent (notes=0xc98970, evidx=0, offset=143705, end=2127526177, path=0x7fffffffbf50)
        at util/annotate.c:631
     #1  0x00000000004d65e3 in annotate_browser__calc_percent (browser=0x7fffffffd130, evsel=0xa01da0) at ui/browsers/annotate.c:364
     #2  0x00000000004d7433 in annotate_browser__run (browser=0x7fffffffd130, evsel=0xa01da0, hbt=0x0) at ui/browsers/annotate.c:672
     #3  0x00000000004d80c9 in symbol__tui_annotate (sym=0xc989a0, map=0xa02660, evsel=0xa01da0, hbt=0x0) at ui/browsers/annotate.c:962
     #4  0x00000000004d7aa0 in hist_entry__tui_annotate (he=0xdf73f0, evsel=0xa01da0, hbt=0x0) at ui/browsers/annotate.c:823
     #5  0x00000000004dd648 in perf_evsel__hists_browse (evsel=0xa01da0, nr_events=1, helpline=
        0x58b768 "For a higher level overview, try: perf report --sort comm,dso", ev_name=0xa02cd0 "cycles", left_exits=false, hbt=
        0x0, min_pcnt=0, env=0xa011e0) at ui/browsers/hists.c:1659
     #6  0x00000000004de372 in perf_evlist__tui_browse_hists (evlist=0xa01520, help=
        0x58b768 "For a higher level overview, try: perf report --sort comm,dso", hbt=0x0, min_pcnt=0, env=0xa011e0)
        at ui/browsers/hists.c:1950
     #7  0x000000000042cf6b in __cmd_report (rep=0x7fffffffd6c0) at builtin-report.c:581
     #8  0x000000000042e25d in cmd_report (argc=0, argv=0x7fffffffe4b0, prefix=0x0) at builtin-report.c:965
     #9  0x000000000041a0e1 in run_builtin (p=0x801548, argc=1, argv=0x7fffffffe4b0) at perf.c:319
     #10 0x000000000041a319 in handle_internal_command (argc=1, argv=0x7fffffffe4b0) at perf.c:376
     #11 0x000000000041a465 in run_argv (argcp=0x7fffffffe38c, argv=0x7fffffffe380) at perf.c:420
     #12 0x000000000041a707 in main (argc=1, argv=0x7fffffffe4b0) at perf.c:521
    
    After the fix is applied the symbol can be annotated showing the
    problematic line "1:      rep"
    
    copy_user_generic_string  /usr/lib/debug/lib/modules/3.9.10-100.fc17.x86_64/vmlinux
                 */
                ENTRY(copy_user_generic_string)
                        CFI_STARTPROC
                        ASM_STAC
                        andl %edx,%edx
                  and    %edx,%edx
                        jz 4f
                  je     37
                        cmpl $8,%edx
                  cmp    $0x8,%edx
                        jb 2f           /* less than 8 bytes, go to byte copy loop */
                  jb     33
                        ALIGN_DESTINATION
                  mov    %edi,%ecx
                  and    $0x7,%ecx
                  je     28
                  sub    $0x8,%ecx
                  neg    %ecx
                  sub    %ecx,%edx
            1a:   mov    (%rsi),%al
                  mov    %al,(%rdi)
                  inc    %rsi
                  inc    %rdi
                  dec    %ecx
                  jne    1a
                        movl %edx,%ecx
            28:   mov    %edx,%ecx
                        shrl $3,%ecx
                  shr    $0x3,%ecx
                        andl $7,%edx
                  and    $0x7,%edx
                1:      rep
    100.00        rep    movsq %ds:(%rsi),%es:(%rdi)
                        movsq
                2:      movl %edx,%ecx
            33:   mov    %edx,%ecx
                3:      rep
                  rep    movsb %ds:(%rsi),%es:(%rdi)
                        movsb
                4:      xorl %eax,%eax
            37:   xor    %eax,%eax
                  data32 xchg %ax,%ax
                        ASM_CLAC
                        ret
                  retq
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Namhyung Kim <namhyung@gmail.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/r/1379009721-27667-1-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    886b37ba
annotate.c 32.1 KB