x86_64 native stack traces: protect some pointer dereferenecs

Guard dereferences of DWARF information to avoid crashing when
the information is wrong or misinterpreted.
This commit is contained in:
Matthew Flatt 2013-07-12 14:36:33 -06:00
parent e8e482acaa
commit 59170d4caf

View File

@ -826,7 +826,7 @@ static inline int
dwarf_reads8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
int8_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->s8;
*addr += sizeof (mvp->s8);
@ -837,7 +837,7 @@ static inline int
dwarf_reads16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
int16_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->s16;
*addr += sizeof (mvp->s16);
@ -848,7 +848,7 @@ static inline int
dwarf_reads32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
int32_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->s32;
*addr += sizeof (mvp->s32);
@ -859,7 +859,7 @@ static inline int
dwarf_reads64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
int64_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->s64;
*addr += sizeof (mvp->s64);
@ -870,7 +870,7 @@ static inline int
dwarf_readu8 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
uint8_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->u8;
*addr += sizeof (mvp->u8);
@ -881,7 +881,7 @@ static inline int
dwarf_readu16 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
uint16_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->u16;
*addr += sizeof (mvp->u16);
@ -892,7 +892,7 @@ static inline int
dwarf_readu32 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
uint32_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->u32;
*addr += sizeof (mvp->u32);
@ -903,7 +903,7 @@ static inline int
dwarf_readu64 (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
uint64_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->u64;
*addr += sizeof (mvp->u64);
@ -914,7 +914,7 @@ static inline int
dwarf_readw (unw_addr_space_t as, unw_accessors_t *a, unw_word_t *addr,
unw_word_t *val, void *arg)
{
dwarf_misaligned_value_t *mvp = (void *) *addr;
dwarf_misaligned_value_t *mvp = (void *)safe_pointer(*addr);
*val = mvp->w;
*addr += sizeof (mvp->w);