Go to file
Kornilios Kourtis f952a6f69f pahole: Avoid segfault when parsing bogus file
When trying to use BTF encoding for an apparently problematic kernel
file, pahole segfaults. As can be seen below [1], the problem is that we
are trying to dereference a NULL decoder.

Fix this by checking the return value of dwfl_getmodules which [2] will
return -1 on errors or an offset if one of the modules did not return
DWARF_CB_OK. (In this specific case, it was __cus__load_debug_types that
returned DWARF_CB_ABORT.)

[1]:

  $ gdb -q --args ./pahole -J vmlinux-5.3.18-24.102-default.debug
  Reading symbols from ./pahole...
  (gdb) r
  Starting program: /tmp/pahole/build/pahole -J vmlinux-5.3.18-24.102-default.debug
  [Thread debugging using libthread_db enabled]
  Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

  Program received signal SIGSEGV, Segmentation fault.
  0x00007ffff7f4000e in gobuffer__size (gb=0x18) at /tmp/pahole/gobuffer.h:39
  39              return gb->index;
  (gdb) bt
  (gdb) frame 1
  1042            if (gobuffer__size(&encoder->percpu_secinfo) != 0)
  (gdb) list
  1037
  1038    int btf_encoder__encode(struct btf_encoder *encoder)
  1039    {
  1040            int err;
  1041
  1042            if (gobuffer__size(&encoder->percpu_secinfo) != 0)
  1043                    btf_encoder__add_datasec(encoder, PERCPU_SECTION);
  1044
  1045            /* Empty file, nothing to do, so... done! */
  1046            if (btf__get_nr_types(encoder->btf) == 0)
  (gdb) print encoder
  $1 = (struct btf_encoder *) 0x0

[2] https://sourceware.org/git/?p=elfutils.git;a=blob;f=libdwfl/libdwfl.h;h=f98f1d525d94bc7bcfc7c816890de5907ee4bd6d;hb=HEAD#l200

Signed-off-by: Kornilios Kourtis <kornilios@isovalent.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Cc: bpf@vger.kernel.org
Cc: dwarves@vger.kernel.org
Link: http://lore.kernel.org/lkml/20220316132338.3226871-1-kkourt@kkourt.io
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-03-17 12:19:40 -03:00
cmake/modules cmake: Add a module to find if obstack is in a separate library 2021-08-20 16:40:27 -03:00
lib libbpf: Update libbpf to the latest git HEAD 2022-01-28 16:30:55 -03:00
man-pages pahole: Introduce --compile to produce a compilable output 2022-03-09 15:54:24 -03:00
ostra ostra: Initial python3 conversion 2019-04-23 12:02:22 -03:00
rpm/SPECS pahole: Prep 1.23 2021-12-08 09:19:32 -03:00
.gitignore pahole: Add build dir, config.h to .gitignore 2019-02-11 12:55:46 -03:00
.gitmodules pahole: add libbpf as submodule under lib/bpf 2019-02-11 12:56:40 -03:00
btf_encoder.c libbpf: Update libbpf to the latest git HEAD 2022-01-28 16:30:55 -03:00
btf_encoder.h pahole: Use per-thread btf instances to avoid mutex locking 2022-01-28 16:30:54 -03:00
btf_loader.c libbpf: Update libbpf to the latest git HEAD 2022-01-28 16:30:55 -03:00
btfdiff btfdiff: Suppress alignment tags with BTF as well as with DWARF 2021-10-28 09:37:26 -03:00
buildcmd.sh buildcmd.sh: Add single build script for use in CI 2021-08-20 16:40:27 -03:00
changes-v1.13 v1.13: New release 2019-04-16 16:13:19 -03:00
changes-v1.16 dwarves: Prep v1.16 2019-12-16 11:43:53 -03:00
changes-v1.17 dwarves: Prep v1.17 2020-03-13 16:36:02 -03:00
changes-v1.18 dwarves: Prep v1.18 2020-10-02 17:29:59 -03:00
changes-v1.19 dwarves: Prep v1.19 2020-11-23 09:52:44 -03:00
changes-v1.20 pahole: Prep 1.20 2021-02-03 21:45:01 -03:00
changes-v1.21 pahole: Prep 1.21 2021-04-09 19:39:15 -03:00
changes-v1.22 pahole: Prep 1.22 2021-08-23 09:48:58 -03:00
changes-v1.23 pahole: Prep 1.23 2021-12-08 09:19:32 -03:00
CMakeLists.txt pahole: Introduce --compile to produce a compilable output 2022-03-09 15:54:24 -03:00
codiff.c dwarves_fprintf: Move cacheline_size into struct conf_fprintf 2021-10-28 10:17:59 -03:00
config.h.cmake [DWARVES] Fixes a FIXME relating to a missing elf (libdw) symbol check. 2008-02-12 21:08:49 -02:00
COPYING [LICENSE]: Add COPYING file and add missing license info on some files 2007-12-17 14:15:42 -02:00
ctf_encoder.c strings: use BTF's string APIs for strings management 2020-10-20 17:17:51 -03:00
ctf_encoder.h Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
ctf_loader.c dwarf_loader: Receive per-thread data on worker threads 2022-01-28 16:19:29 -03:00
ctf.h Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
ctfdwdiff ctfdwdiff: Don't ask for variables and inline expansions in pfunct 2009-03-31 19:21:46 -03:00
ctracer.c emit: Search for data structures using its type in addition to its name 2022-02-07 16:13:27 -03:00
dtagnames.c dwarves_fprintf: Move cacheline_size into struct conf_fprintf 2021-10-28 10:17:59 -03:00
dutil.c dutil: elf_symtab__new() doesn't need the GElf_Ehdr *ep argument 2021-08-20 16:40:27 -03:00
dutil.h dutil: Move DW_TAG_LLVM_annotation definition to dutil.h 2021-11-23 20:37:43 -03:00
dwarf_loader.c pahole: Avoid segfault when parsing bogus file 2022-03-17 12:19:40 -03:00
dwarves_emit.c emit: Notice type shadowing, i.e. multiple types with the same name (enum, struct, union, etc) 2022-02-08 15:46:55 -03:00
dwarves_emit.h emit: Search for data structures using its type in addition to its name 2022-02-07 16:13:27 -03:00
dwarves_fprintf.c fprintf: Consider enumerations without members as forward declarations 2022-02-03 11:30:34 -03:00
dwarves_reorganize.c core: base_type__name() doesn't need a 'cu' arg 2021-08-12 09:41:13 -03:00
dwarves_reorganize.h Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
dwarves.c emit: Notice type shadowing, i.e. multiple types with the same name (enum, struct, union, etc) 2022-02-08 15:46:55 -03:00
dwarves.h core: Ditch 'dwarves__active_loader' extern declaration, it was nuked 2022-03-09 15:49:05 -03:00
elf_symtab.c elf_symtab: Remove needless GElf_Ehdr pointer argument from the constructor 2021-08-20 16:40:27 -03:00
elf_symtab.h elf_symtab: Remove needless GElf_Ehdr pointer argument from the constructor 2021-08-20 16:40:27 -03:00
elfcreator.c elfcreator: elfcreator_copy_scn() doesn't need the 'elf' arg 2021-08-20 16:40:27 -03:00
elfcreator.h elfcreator: elfcreator_copy_scn() doesn't need the 'elf' arg 2021-08-20 16:40:27 -03:00
fullcircle v1.13: New release 2019-04-16 16:13:19 -03:00
gobuffer.c gobuffer: Use zfree() and make delete accept NULL, like free() 2021-05-27 11:00:18 -03:00
gobuffer.h Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
hash.h hash: Remove unused hash_32(), hash_ptr() 2021-08-20 16:40:27 -03:00
libctf.c elf_symtab: Remove needless GElf_Ehdr pointer argument from the constructor 2021-08-20 16:40:27 -03:00
libctf.h strings: use BTF's string APIs for strings management 2020-10-20 17:17:51 -03:00
list.h list: Adopt list_next_entry() from the Linux kernel 2021-08-20 16:40:27 -03:00
MANIFEST pahole: Prep 1.23 2021-12-08 09:19:32 -03:00
NEWS pahole: Prep 1.23 2021-12-08 09:19:32 -03:00
pahole.c pahole: Introduce --compile to produce a compilable output 2022-03-09 15:54:24 -03:00
pdwtags.c dwarf_loader: Receive per-thread data on worker threads 2022-01-28 16:19:29 -03:00
pfunct.c dwarf_loader: Receive per-thread data on worker threads 2022-01-28 16:19:29 -03:00
pglobal.c dwarves_fprintf: Move cacheline_size into struct conf_fprintf 2021-10-28 10:17:59 -03:00
prefcnt.c dwarves_fprintf: Move cacheline_size into struct conf_fprintf 2021-10-28 10:17:59 -03:00
rbtree.c Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
rbtree.h Adopt SPDX-License-Identifier 2019-01-18 15:41:48 -03:00
README README: Add documentation for -DBUILD_SHARED_LIBS 2021-06-10 14:31:44 -03:00
README.btf v1.13: New release 2019-04-16 16:13:19 -03:00
README.cross README: Add instructions to do a cross build 2020-08-17 09:52:02 -03:00
README.ctracer ctracer: update README.ctracer, f9 has the dwarves 2008-10-29 08:54:53 -02:00
README.DEBUG README.DEBUG: Add an extra step to make the instructions cut'n'exec 2017-12-14 14:15:54 -03:00
README.tarball README.tarball: Overcome --transform problem with symlinks 2021-08-20 16:40:27 -03:00
regtest regtest: Accept --diff instad of plain 'diff' as long option 2012-05-14 19:36:58 -03:00
scncopy.c elfcreator: elfcreator_copy_scn() doesn't need the 'elf' arg 2021-08-20 16:40:27 -03:00
syscse.c syscse: zero_extend() doesn't need a 'cu' arg 2021-08-20 16:40:27 -03:00

Build instructions:

1. install cmake
2. mkdir build
3. cd build
4. cmake -D__LIB=lib ..
5. make install

cmake Options:
  -DBUILD_SHARED_LIBS
    By default SHARED libraries are created and applications are linked to it.
    Use -DBUILD_SHARED_LIBS=OFF while invoking cmake to create STATIC libraries
    and link applications to it.

    Ex. cmake -D__LIB=lib -DBUILD_SHARED_LIBS=OFF ..

  -DCMAKE_INSTALL_PREFIX
    Default is to install to /usr/local, use -DCMAKE_INSTALL_PREFIX=
    when invoking cmake to specify another install location.

Known to work scenarios:

Mandriva Cooker:

cmake 2.4.5-1mdv2007.1
libelfutils1-devel 0.123-1mdv2007.1

Debian Unstable:

cmake 2.4.5-1
libdw-dev 0.123-2

Fedora Core 6:

cmake 2.4.5-2.fc6
elfutils-devel 0.126-1.fc6