This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Be more strict about what kinds of types can be passed.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5f4ce105edc3ebbd4b0425d41ccac0064e3cec41

commit 5f4ce105edc3ebbd4b0425d41ccac0064e3cec41
Author: Doug Evans <xdje42@gmail.com>
Date:   Sat Jan 31 21:14:17 2015 -0800

    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.

Diff:
---
 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 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)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]