This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
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