This is the mail archive of the gdb-patches@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]

Re: Fix crash in -var-delete


Daniel Jacobowitz wrote:

> On Wed, Nov 07, 2007 at 10:57:59PM +0300, Vladimir Prus wrote:
>> The patch and a testcase are attached. OK?
> 
> OK (if you write the changelog)

Thanks. Here's what I've checked in (with changelog).

- Volodya


Index: ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.8910
diff -u -p -r1.8910 ChangeLog
--- ChangeLog	7 Nov 2007 06:58:31 -0000	1.8910
+++ ChangeLog	7 Nov 2007 20:05:31 -0000
@@ -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: varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.96
diff -u -p -r1.96 varobj.c
--- varobj.c	27 Sep 2007 18:04:12 -0000	1.96
+++ varobj.c	7 Nov 2007 20:05:32 -0000
@@ -1292,6 +1292,8 @@ delete_variable_1 (struct cpstack **resu
   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);
Index: testsuite/ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/ChangeLog,v
retrieving revision 1.1483
diff -u -p -r1.1483 ChangeLog
--- testsuite/ChangeLog	5 Nov 2007 11:32:31 -0000	1.1483
+++ testsuite/ChangeLog	7 Nov 2007 20:05:37 -0000
@@ -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: testsuite/gdb.mi/mi-var-child.c
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-child.c,v
retrieving revision 1.6
diff -u -p -r1.6 mi-var-child.c
--- testsuite/gdb.mi/mi-var-child.c	23 Aug 2007 18:08:49 -0000	1.6
+++ testsuite/gdb.mi/mi-var-child.c	7 Nov 2007 20:05:37 -0000
@@ -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: testsuite/gdb.mi/mi-var-child.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-child.exp,v
retrieving revision 1.26
diff -u -p -r1.26 mi-var-child.exp
--- testsuite/gdb.mi/mi-var-child.exp	23 Aug 2007 18:14:19 -0000	1.26
+++ testsuite/gdb.mi/mi-var-child.exp	7 Nov 2007 20:05:37 -0000
@@ -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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]