diff options
author | Petr Machata <pmachata@redhat.com> | 2015-04-01 21:44:32 +0200 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2015-04-03 13:21:09 +0200 |
commit | 71de1d2a8a3fffc83c707642a24f350d7217f83c (patch) | |
tree | d6a0107cf2b7990fded43f0fc66d2cd00d84ff62 | |
parent | 224e2e61b25eed8d320a286bbbd12f9ea4a7799e (diff) | |
download | elfutils-71de1d2a8a3fffc83c707642a24f350d7217f83c.tar.gz |
Do not reject type units in dwarf_getsrcfiles and dwarf_getsrclines
Signed-off-by: Petr Machata <pmachata@redhat.com>
-rw-r--r-- | libdw/ChangeLog | 9 | ||||
-rw-r--r-- | libdw/dwarf_error.c | 3 | ||||
-rw-r--r-- | libdw/dwarf_getsrcfiles.c | 11 | ||||
-rw-r--r-- | libdw/dwarf_getsrclines.c | 11 | ||||
-rw-r--r-- | libdw/libdwP.h | 7 |
5 files changed, 32 insertions, 9 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 3ca85cbe..3abb3828 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,12 @@ +2015-04-01 Petr Machata <pmachata@redhat.com> + + * libdwP.h (DWARF_E_NOT_CUDIE): New enumerator. + (is_cudie): New function. + * dwarf_error.c (errmsgs): Add message for DWARF_E_NOT_CUDIE. + * dwarf_getsrcfiles.c (dwarf_getsrcfiles): Call is_cudie instead + of white-listing valid tags. + * dwarf_getsrclines.c (dwarf_getsrclines): Likewise. + 2015-03-18 Petr Machata <pmachata@redhat.com> * Makefile.am (pkginclude_HEADERS): Add known-dwarf.h. diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c index 08b691aa..aa97a68e 100644 --- a/libdw/dwarf_error.c +++ b/libdw/dwarf_error.c @@ -1,5 +1,5 @@ /* Retrieve ELF descriptor used for DWARF access. - Copyright (C) 2002, 2003, 2004, 2005, 2009, 2014 Red Hat, Inc. + Copyright (C) 2002, 2003, 2004, 2005, 2009, 2014, 2015 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -93,6 +93,7 @@ static const char *errmsgs[] = [DWARF_E_INVALID_CFI] = N_("invalid CFI section"), [DWARF_E_NO_ALT_DEBUGLINK] = N_("no alternative debug link found"), [DWARF_E_INVALID_OPCODE] = N_("invalid opcode"), + [DWARF_E_NOT_CUDIE] = N_("not a CU (unit) DIE"), }; #define nerrmsgs (sizeof (errmsgs) / sizeof (errmsgs[0])) diff --git a/libdw/dwarf_getsrcfiles.c b/libdw/dwarf_getsrcfiles.c index 4bfc34b8..5af6f68b 100644 --- a/libdw/dwarf_getsrcfiles.c +++ b/libdw/dwarf_getsrcfiles.c @@ -1,5 +1,5 @@ /* Return source file information of CU. - Copyright (C) 2004, 2005, 2013 Red Hat, Inc. + Copyright (C) 2004, 2005, 2013, 2015 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2004. @@ -39,10 +39,13 @@ int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles) { - if (unlikely (cudie == NULL - || (INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit - && INTUSE(dwarf_tag) (cudie) != DW_TAG_partial_unit))) + if (cudie == NULL) return -1; + if (! is_cudie (cudie)) + { + __libdw_seterrno (DWARF_E_NOT_CUDIE); + return -1; + } int res = -1; diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c index 053b30f2..368f2fd8 100644 --- a/libdw/dwarf_getsrclines.c +++ b/libdw/dwarf_getsrclines.c @@ -1,5 +1,5 @@ /* Return line number information of CU. - Copyright (C) 2004-2010, 2013, 2014 Red Hat, Inc. + Copyright (C) 2004-2010, 2013, 2014, 2015 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2004. @@ -838,10 +838,13 @@ __libdw_getcompdir (Dwarf_Die *cudie) int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines) { - if (unlikely (cudie == NULL - || (INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit - && INTUSE(dwarf_tag) (cudie) != DW_TAG_partial_unit))) + if (cudie == NULL) return -1; + if (! is_cudie (cudie)) + { + __libdw_seterrno (DWARF_E_NOT_CUDIE); + return -1; + } /* Get the information if it is not already known. */ struct Dwarf_CU *const cu = cudie->cu; diff --git a/libdw/libdwP.h b/libdw/libdwP.h index e38e0c9b..fc779601 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -128,6 +128,7 @@ enum DWARF_E_INVALID_CFI, DWARF_E_NO_ALT_DEBUGLINK, DWARF_E_INVALID_OPCODE, + DWARF_E_NOT_CUDIE, }; @@ -725,6 +726,12 @@ cu_sec_idx (struct Dwarf_CU *cu) return cu->type_offset == 0 ? IDX_debug_info : IDX_debug_types; } +static inline bool +is_cudie (Dwarf_Die *cudie) +{ + return CUDIE (cudie->cu).addr == cudie->addr; +} + /* Read up begin/end pair and increment read pointer. - If it's normal range record, set up *BEGINP and *ENDP and return 0. - If it's base address selection record, set up *BASEP and return 1. |