summaryrefslogtreecommitdiffstats
path: root/backends/ppc64_retval.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2013-02-06 13:15:10 +0100
committerMark Wielaard <[email protected]>2013-02-06 23:27:03 +0100
commit1d5037f725b691929396896fd2b6be3cae1d87ef (patch)
treeefa4f61691eb0d74b6dae5ceb4b3901282420741 /backends/ppc64_retval.c
parent6c4b2078c51c687a1a192b001f0b331a0ccac629 (diff)
backends: Check type DIE exists before calling dwarf_tag ().
dwarf_attr () or dwarf_form () functions leave typedie NULL when they fail because of missing attribute or unexpected form. In such cases first check the DIE exists and return error instead of calling dwarf_tag () and crashing. This also happens in the testsuite with native tests when elfutils is build without DWZ support on a distro that uses DWZ DWARF compression on system libraries. Only the backends used dwarf_tag () directly without checking, all other uses in elfutils already checked whether the given DIE was NULL. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'backends/ppc64_retval.c')
-rw-r--r--backends/ppc64_retval.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/backends/ppc64_retval.c b/backends/ppc64_retval.c
index b26bb1ee..c5c3b6fe 100644
--- a/backends/ppc64_retval.c
+++ b/backends/ppc64_retval.c
@@ -87,7 +87,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
Dwarf_Die die_mem;
Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
- int tag = dwarf_tag (typedie);
+ int tag = DWARF_TAG_OR_RETURN (typedie);
/* Follow typedefs and qualifiers to get to the actual type. */
while (tag == DW_TAG_typedef
@@ -96,7 +96,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
{
attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
typedie = dwarf_formref_die (attr, &die_mem);
- tag = dwarf_tag (typedie);
+ tag = DWARF_TAG_OR_RETURN (typedie);
}
Dwarf_Word size;
@@ -110,7 +110,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
{
attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
typedie = dwarf_formref_die (attr, &die_mem);
- tag = dwarf_tag (typedie);
+ tag = DWARF_TAG_OR_RETURN (typedie);
}
/* Fall through. */
@@ -181,7 +181,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
/* Check if it's a character array. */
attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
typedie = dwarf_formref_die (attr, &die_mem);
- tag = dwarf_tag (typedie);
+ tag = DWARF_TAG_OR_RETURN (typedie);
if (tag != DW_TAG_base_type)
goto aggregate;
if (dwarf_formudata (dwarf_attr_integrate (typedie,