From 3c3185ac88fb76e53625ea3e7b0da486f94b238d Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 7 Jul 2008 22:39:59 +0000 Subject: [PATCH] gdb/ * breakpoint.c (bpstat_copy): Call RELEASE_VALUE on the new OLD_VAL. gdb/testsuite/ * gdb.base/value-double-free.exp, gdb.base/value-double-free.c: New. --- gdb/ChangeLog | 4 +++ gdb/breakpoint.c | 5 ++- gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/gdb.base/value-double-free.c | 36 +++++++++++++++++++ gdb/testsuite/gdb.base/value-double-free.exp | 38 ++++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/value-double-free.c create mode 100644 gdb/testsuite/gdb.base/value-double-free.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 09421654122..059d19acde4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2008-07-07 Jan Kratochvil + + * breakpoint.c (bpstat_copy): Call RELEASE_VALUE on the new OLD_VAL. + 2008-07-07 Pedro Alves * i386-dicos-tdep.c: Include "inferior.h". diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 73d962cc945..e774bca940b 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1996,7 +1996,10 @@ bpstat_copy (bpstat bs) if (bs->commands != NULL) tmp->commands = copy_command_lines (bs->commands); if (bs->old_val != NULL) - tmp->old_val = value_copy (bs->old_val); + { + tmp->old_val = value_copy (bs->old_val); + release_value (tmp->old_val); + } if (p == NULL) /* This is the first thing in the chain. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1f4427e0268..de83fcd2fb5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-07-07 Jan Kratochvil + + * gdb.base/value-double-free.exp, gdb.base/value-double-free.c: New. + 2008-06-28 Vladimir Prus * lib/mi-support.exp (mi_send_resuming_command_raw): Revert diff --git a/gdb/testsuite/gdb.base/value-double-free.c b/gdb/testsuite/gdb.base/value-double-free.c new file mode 100644 index 00000000000..46ca150aee0 --- /dev/null +++ b/gdb/testsuite/gdb.base/value-double-free.c @@ -0,0 +1,36 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +volatile int var; + +void +empty (void) +{ +} + +int +main (void) +{ + var = 1; + /* Workaround PR 38: We may miss the first watchpoint hit as we stop on the + exact instruction which would cause the watchpoint hit. */ + var = 2; + return 0; +} diff --git a/gdb/testsuite/gdb.base/value-double-free.exp b/gdb/testsuite/gdb.base/value-double-free.exp new file mode 100644 index 00000000000..8494f538782 --- /dev/null +++ b/gdb/testsuite/gdb.base/value-double-free.exp @@ -0,0 +1,38 @@ +# Copyright 2008 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set testfile value-double-free +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + untested "Couldn't compile test program" + return -1 +} + +# Get things started. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] { + return -1 +} +gdb_test "watch var" "atchpoint \[0-9\]+: var" +gdb_test "continue" "atchpoint \[0-9\]+: var.*Old value = 0.*New value = \[12\].*" +gdb_test "print empty()" " = void" +# We did segfault here. +gdb_test "help help" -- 2.30.2