diff options
author | Mark Wielaard <mark@klomp.org> | 2018-06-08 20:45:48 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2018-06-11 08:35:51 +0200 |
commit | 95e3d07a6742992cf22e239389cab12ba0d4d95d (patch) | |
tree | 36da03c165aaad8e191b4e41b85cfa3d672a1556 /libdw | |
parent | b958e6b0fbe6aa246bbbbdec34487476b01d1f2e (diff) |
libdw: Check validity of dwarf_getabbrev arguments.
When the given Dwarf_Die was invalid we might crash and when the offset
was totally bogus we might succeed with a random abbrev.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libdw')
-rw-r--r-- | libdw/ChangeLog | 4 | ||||
-rw-r--r-- | libdw/dwarf_getabbrev.c | 20 |
2 files changed, 21 insertions, 3 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 21cb03c2..1195cf6e 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,5 +1,9 @@ 2018-06-08 Mark Wielaard <mark@klomp.org> + * dwarf_getabbrev.c (dwarf_getabbrev): Check die and offset. + +2018-06-08 Mark Wielaard <mark@klomp.org> + * dwarf_get_units.c (dwarf_get_units): Handle existing error, no dwarf. diff --git a/libdw/dwarf_getabbrev.c b/libdw/dwarf_getabbrev.c index 1e113dbe..988d12c2 100644 --- a/libdw/dwarf_getabbrev.c +++ b/libdw/dwarf_getabbrev.c @@ -158,7 +158,21 @@ __libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu, Dwarf_Off offset, Dwarf_Abbrev * dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset, size_t *lengthp) { - return __libdw_getabbrev (die->cu->dbg, die->cu, - die->cu->orig_abbrev_offset + offset, lengthp, - NULL); + if (die == NULL || die->cu == NULL) + return NULL; + + Dwarf_CU *cu = die->cu; + Dwarf *dbg = cu->dbg; + Dwarf_Off abbrev_offset = cu->orig_abbrev_offset; + Elf_Data *data = dbg->sectiondata[IDX_debug_abbrev]; + if (data == NULL) + return NULL; + + if (offset >= data->d_size - abbrev_offset) + { + __libdw_seterrno (DWARF_E_INVALID_OFFSET); + return NULL; + } + + return __libdw_getabbrev (dbg, cu, abbrev_offset + offset, lengthp, NULL); } |