summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dwarf_prototypes.c47
1 files changed, 35 insertions, 12 deletions
diff --git a/dwarf_prototypes.c b/dwarf_prototypes.c
index 8466c88..4a23ae7 100644
--- a/dwarf_prototypes.c
+++ b/dwarf_prototypes.c
@@ -328,7 +328,10 @@ static struct arg_type_info *get_enum(Dwarf_Die *parent,
CLEANUP_AND_RETURN_ERROR(NULL);
}
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ if (dict_insert(type_dieoffset_hash, &die_offset, &result) != 0) {
+ complain(parent, "Couldn't insert into cache dict");
+ CLEANUP_AND_RETURN_ERROR(NULL);
+ }
uint64_t byte_size;
if (!get_die_numeric(&byte_size, parent, DW_AT_byte_size)) {
@@ -465,7 +468,10 @@ static struct arg_type_info *get_array(Dwarf_Die *parent,
CLEANUP_AND_RETURN_ERROR(NULL);
}
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ if (dict_insert(type_dieoffset_hash, &die_offset, &result) != 0) {
+ complain(parent, "Couldn't insert into cache dict");
+ CLEANUP_AND_RETURN_ERROR(NULL);
+ }
array_type = get_type(&newly_allocated_array_type,
&type_die, plib, type_dieoffset_hash);
if (array_type == NULL) {
@@ -574,7 +580,10 @@ static struct arg_type_info *get_structure(Dwarf_Die *parent,
CLEANUP_AND_RETURN_ERROR(NULL);
}
type_init_struct(result);
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ if (dict_insert(type_dieoffset_hash, &die_offset, &result) != 0) {
+ complain(parent, "Couldn't insert into cache dict");
+ CLEANUP_AND_RETURN_ERROR(NULL);
+ }
Dwarf_Die die;
if (dwarf_child(parent, &die) != 0) {
@@ -605,8 +614,11 @@ static struct arg_type_info *get_structure(Dwarf_Die *parent,
complain(&die, "Couldn't parse type from DWARF data");
CLEANUP_AND_RETURN_ERROR(NULL);
}
- type_struct_add(result, member_type,
- newly_allocated_member_type);
+ if (type_struct_add(result, member_type,
+ newly_allocated_member_type) != 0) {
+ complain(&die, "Couldn't add type to struct");
+ CLEANUP_AND_RETURN_ERROR(NULL);
+ }
NEXT_SIBLING(&die);
}
@@ -641,6 +653,16 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
return ret; \
} while (0)
+#define DICT_INSERT_AND_CHECK(type_dieoffset_hash, die_offset, result) \
+ do { \
+ if (dict_insert(type_dieoffset_hash, \
+ die_offset, result) != 0) { \
+ complain(type_die, \
+ "Couldn't insert into cache dict"); \
+ CLEANUP_AND_RETURN_ERROR(NULL); \
+ } \
+ } while(0)
+
struct arg_type_info *result = NULL;
struct arg_type_info *pointee = NULL;
int newly_allocated_pointee = 0;
@@ -680,7 +702,7 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
case DW_TAG_base_type:
complain(type_die, "Storing base type");
result = type_get_simple(get_base_type(type_die));
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
case DW_TAG_subroutine_type:
@@ -689,7 +711,7 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
// dereference these, it'll get a segfault
complain(type_die, "Storing subroutine type");
result = type_get_simple(ARGTYPE_VOID);
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
case DW_TAG_pointer_type:
@@ -698,7 +720,7 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
// void*
complain(type_die, "Storing void-pointer type");
result = type_get_voidptr();
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
}
@@ -710,7 +732,7 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
complain(type_die, "alloc error");
CLEANUP_AND_RETURN_ERROR(NULL);
}
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
pointee = get_type(&newly_allocated_pointee,
&next_die, plib, type_dieoffset_hash);
if (pointee == NULL)
@@ -746,7 +768,7 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
result = type_get_simple(ARGTYPE_VOID);
complain(type_die, "Storing void type");
}
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
case DW_TAG_enumeration_type:
@@ -772,17 +794,18 @@ static struct arg_type_info *get_type(int *newly_allocated_result,
case DW_TAG_union_type:
result = type_get_simple(ARGTYPE_VOID);
complain(type_die, "Storing union-as-void type");
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
default:
complain(type_die, "Unknown type tag 0x%x. Returning void",
dwarf_tag(type_die));
result = type_get_simple(ARGTYPE_VOID);
- dict_insert(type_dieoffset_hash, &die_offset, &result);
+ DICT_INSERT_AND_CHECK(type_dieoffset_hash, &die_offset, &result);
return result;
}
+#undef DICT_INSERT_AND_CHECK
#undef CLEANUP_AND_RETURN_ERROR
}