From 5f4ce105edc3ebbd4b0425d41ccac0064e3cec41 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Sat, 31 Jan 2015 21:14:17 -0800 Subject: [PATCH] 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/gnu-v3-abi.c | 22 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 46b94c3687b..18cbf2edd8c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2015-01-31 Doug Evans + + * 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 * gdbtypes.c (copy_type_recursive): Handle all TYPE_SPECIFIC_FIELD diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index 41c6735d539..a62599bf209 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) {