aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <xdje42@gmail.com>2015-01-31 21:14:17 -0800
committerDoug Evans <xdje42@gmail.com>2015-01-31 21:14:17 -0800
commit5f4ce105edc3ebbd4b0425d41ccac0064e3cec41 (patch)
tree532a355ec8d51ef970e725bd16bce3d28c704aef
parentf6b3afbf2fce69c31bd738e0543c55fbd848e74a (diff)
downloadgdb-5f4ce105edc3ebbd4b0425d41ccac0064e3cec41.zip
gdb-5f4ce105edc3ebbd4b0425d41ccac0064e3cec41.tar.gz
gdb-5f4ce105edc3ebbd4b0425d41ccac0064e3cec41.tar.bz2
Be more strict about what kinds of types can be passed.
gdb/ChangeLog: * gnu-v3-abi.c (gnuv3_dynamic_class): Assert only passed structs or unions. Return zero if union. (gnuv3_get_vtable): Call check_typedef. Assert only passed structs. (gnuv3_rtti_type): Pass already-check_typedef'd value to gnuv3_get_vtable. (compute_vtable_size): Assert only passed structs. (gnuv3_print_vtable): Don't call gnuv3_get_vtable for non-structs.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/gnu-v3-abi.c22
2 files changed, 28 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 46b94c3..18cbf2e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2015-01-31 Doug Evans <xdje42@gmail.com>
+ * gnu-v3-abi.c (gnuv3_dynamic_class): Assert only passed structs
+ or unions. Return zero if union.
+ (gnuv3_get_vtable): Call check_typedef. Assert only passed structs.
+ (gnuv3_rtti_type): Pass already-check_typedef'd value to
+ gnuv3_get_vtable.
+ (compute_vtable_size): Assert only passed structs.
+ (gnuv3_print_vtable): Don't call gnuv3_get_vtable for non-structs.
+
+2015-01-31 Doug Evans <xdje42@gmail.com>
+
* gdbtypes.c (copy_type_recursive): Handle all TYPE_SPECIFIC_FIELD
kinds.
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index 41c6735..a62599b 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -202,6 +202,12 @@ gnuv3_dynamic_class (struct type *type)
{
int fieldnum, fieldelem;
+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
+ || TYPE_CODE (type) == TYPE_CODE_UNION);
+
+ if (TYPE_CODE (type) == TYPE_CODE_UNION)
+ return 0;
+
if (TYPE_CPLUS_DYNAMIC (type))
return TYPE_CPLUS_DYNAMIC (type) == 1;
@@ -246,9 +252,12 @@ gnuv3_get_vtable (struct gdbarch *gdbarch,
struct value *vtable_pointer;
CORE_ADDR vtable_address;
+ CHECK_TYPEDEF (container_type);
+ gdb_assert (TYPE_CODE (container_type) == TYPE_CODE_STRUCT);
+
/* If this type does not have a virtual table, don't read the first
field. */
- if (!gnuv3_dynamic_class (check_typedef (container_type)))
+ if (!gnuv3_dynamic_class (container_type))
return NULL;
/* We do not consult the debug information to find the virtual table.
@@ -301,7 +310,7 @@ gnuv3_rtti_type (struct value *value,
if (using_enc_p)
*using_enc_p = 0;
- vtable = gnuv3_get_vtable (gdbarch, value_type (value),
+ vtable = gnuv3_get_vtable (gdbarch, values_type,
value_as_address (value_addr (value)));
if (vtable == NULL)
return NULL;
@@ -821,6 +830,8 @@ compute_vtable_size (htab_t offset_hash,
void **slot;
struct value_and_voffset search_vo, *current_vo;
+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT);
+
/* If the object is not dynamic, then we are done; as it cannot have
dynamic base types either. */
if (!gnuv3_dynamic_class (type))
@@ -949,8 +960,11 @@ gnuv3_print_vtable (struct value *value)
}
gdbarch = get_type_arch (type);
- vtable = gnuv3_get_vtable (gdbarch, type,
- value_as_address (value_addr (value)));
+
+ vtable = NULL;
+ if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
+ vtable = gnuv3_get_vtable (gdbarch, type,
+ value_as_address (value_addr (value)));
if (!vtable)
{