• Andrey Ryabinin's avatar
    perf buildid: Fix off-by-one in write_buildid() · 70a2cba9
    Andrey Ryabinin authored
    write_buildid() increments 'name_len' with intention to take into
    account trailing zero byte. However, 'name_len' was already incremented
    in machine__write_buildid_table() before.  So this leads to
    out-of-bounds read in do_write():
    
      $ ./perf record sleep 0
      [ perf record: Woken up 1 times to write data ]
      =================================================================
      ==15899==ERROR: AddressSanitizer: global-buffer-overflow on address 0x00000099fc92 at pc 0x7f1aa9c7eab5 bp 0x7fff940f84d0 sp 0x7fff940f7c78
      READ of size 19 at 0x00000099fc92 thread T0
          #0 0x7f1aa9c7eab4  (/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libasan.so.2+0x44ab4)
          #1 0x649c5b in do_write util/header.c:67
          #2 0x649c5b in write_padded util/header.c:82
          #3 0x57e8bc in write_buildid util/build-id.c:239
          #4 0x57e8bc in machine__write_buildid_table util/build-id.c:278
      ...
    
      0x00000099fc92 is located 0 bytes to the right of global variable '*.LC99' defined in 'util/symbol.c' (0x99fc80) of size 18
        '*.LC99' is ascii string '[kernel.kallsyms]'
      ...
    
      Shadow bytes around the buggy address:
        0x00008012bf80: f9 f9 f9 f9 00 00 00 00 00 00 03 f9 f9 f9 f9 f9
      =>0x00008012bf90: 00 00[02]f9 f9 f9 f9 f9 00 00 00 00 00 05 f9 f9
        0x00008012bfa0: f9 f9 f9 f9 00 03 f9 f9 f9 f9 f9 f9 00 00 00 00
    Signed-off-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/1461053847-5633-1-git-send-email-aryabinin@virtuozzo.com
    [ Remove the off-by one at the origin, to keep len(s) == strlen(s) assumption ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    70a2cba9
build-id.c 12.7 KB