summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2015-04-01 21:44:32 +0200
committerPetr Machata <pmachata@redhat.com>2015-04-03 13:21:09 +0200
commit71de1d2a8a3fffc83c707642a24f350d7217f83c (patch)
treed6a0107cf2b7990fded43f0fc66d2cd00d84ff62
parent224e2e61b25eed8d320a286bbbd12f9ea4a7799e (diff)
downloadelfutils-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/ChangeLog9
-rw-r--r--libdw/dwarf_error.c3
-rw-r--r--libdw/dwarf_getsrcfiles.c11
-rw-r--r--libdw/dwarf_getsrclines.c11
-rw-r--r--libdw/libdwP.h7
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.