Fix crash when a variable object being deleted
authorVladimir Prus <vladimir@codesourcery.com>
Wed, 7 Nov 2007 20:06:29 +0000 (20:06 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Wed, 7 Nov 2007 20:06:29 +0000 (20:06 +0000)
has any of its children deleted previously.

* varobj.c (delete_variable_1): Don't recurse
into deleted children.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-var-child.c
gdb/testsuite/gdb.mi/mi-var-child.exp
gdb/varobj.c

index af8f60287be609aea85edd3574ebbf36af18cac4..ab6711ec384145d80d39f055e4c148162d68350e 100644 (file)
@@ -1,3 +1,11 @@
+2007-11-07  Vladimir Prus  <vladimir@codesourcery.com>
+
+       Fix crash when a variable object being deleted
+       has any of its children deleted previously.
+       
+       * varobj.c (delete_variable_1): Don't recurse
+       into deleted children.
+       
 2007-11-07  Markus Deuling  <deuling@de.ibm.com>
 
        * gdbarch.sh (legacy_virtual_frame_pointer): Add gdbarch parameter.
index 290ec1b8633bce3e8d37419159eccbac3b622705..dbc601162a38603a705a9cea77616d1b1211402a 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-07  Vladimir Prus  <vladimir@codesourcery.com>
+
+       * gdb.mi/mi-var-child.c (do_child_deletion): New.
+       * gdb.mi/mi-var-child.exp: Run child_deletion tests.
+       
 2007-11-05  Luis Machado  <luisgpm@br.ibm.com>
 
        * gdb.base/printcmds.exp: New function
index 393efd24d57ad45e142f03800954634ef06aea6e..406f0e2e2c70ae0f2214483c3202573e60d05ca5 100644 (file)
@@ -306,6 +306,29 @@ do_special_tests (void)
   incr_a(2);
 }
 
+struct very_simple_struct
+{
+  int a;
+  int b;
+};
+
+int
+do_child_deletion (void)
+{
+  /*: BEGIN: child_deletion :*/
+  struct very_simple_struct s = {1, 2};
+  /*:
+    mi_create_varobj S s "create varobj for s"
+    mi_list_varobj_children S {{S.a a 0 int} {S.b b 0 int}}    \
+       "list children of S"
+    mi_delete_varobj S.a "delete S.a"    
+    mi_delete_varobj S.b "delete S.b"
+    mi_delete_varobj S "delete S"
+    :*/
+  return 99;
+  /*: END: child_deletion :*/  
+}
+
 int
 main (int argc, char *argv [])
 {
@@ -313,6 +336,7 @@ main (int argc, char *argv [])
   do_block_tests ();
   do_children_tests ();
   do_special_tests ();
+  do_child_deletion ();
   exit (0);
 }
 
index aad9727c39320025924f7fc31396e141efbb9ff3..c26cada8aa6b5786ad9c43d5e10d4d9439826f83 100644 (file)
@@ -1227,7 +1227,9 @@ mi_gdb_test "-var-update *" \
        "\\^done,changelist=\\\[\{name=\"psnp->ptrs.0.next.next.long_ptr\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
        "update all vars psnp->next->next->long_ptr (and 2.long_ptr) changed"
 
+mi_prepare_inline_tests $srcfile
 
+mi_run_inline_test child_deletion
 
 
 mi_gdb_exit
index d6125c6e448fe896378e0e44801d1133c3c2b586..fb1fd1d9c6aaafaa93e69ab25a901d15b1c1f16f 100644 (file)
@@ -1292,6 +1292,8 @@ delete_variable_1 (struct cpstack **resultp, int *delcountp,
   for (i = 0; i < VEC_length (varobj_p, var->children); ++i)
     {   
       varobj_p child = VEC_index (varobj_p, var->children, i);
+      if (!child)
+       continue;
       if (!remove_from_parent_p)
        child->parent = NULL;
       delete_variable_1 (resultp, delcountp, child, 0, only_children_p);