diff options
Diffstat (limited to 'libdw/dwarf_formsdata.c')
-rw-r--r-- | libdw/dwarf_formsdata.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/libdw/dwarf_formsdata.c b/libdw/dwarf_formsdata.c index e7deaee1..def32c9d 100644 --- a/libdw/dwarf_formsdata.c +++ b/libdw/dwarf_formsdata.c @@ -1,5 +1,5 @@ /* Return signed constant represented by attribute. - Copyright (C) 2003, 2005, 2014 Red Hat, Inc. + Copyright (C) 2003, 2005, 2014, 2017 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper <[email protected]>, 2003. @@ -53,25 +53,25 @@ dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_sval) __libdw_seterrno (DWARF_E_INVALID_DWARF); return -1; } - *return_sval = *attr->valp; + *return_sval = (signed char) *attr->valp; break; case DW_FORM_data2: if (datap + 2 > endp) goto invalid; - *return_sval = read_2ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_2sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_data4: if (datap + 4 > endp) goto invalid; - *return_sval = read_4ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_4sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_data8: if (datap + 8 > endp) goto invalid; - *return_sval = read_8ubyte_unaligned (attr->cu->dbg, attr->valp); + *return_sval = read_8sbyte_unaligned (attr->cu->dbg, attr->valp); break; case DW_FORM_sdata: @@ -86,6 +86,11 @@ dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_sval) get_uleb128 (*return_sval, datap, endp); break; + case DW_FORM_implicit_const: + // The data comes from the abbrev, which has been bounds checked. + get_sleb128_unchecked (*return_sval, datap); + break; + default: __libdw_seterrno (DWARF_E_NO_CONSTANT); return -1; |