diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 75567737420..3fa492dc65a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2004-01-27 Paul N. Hilfinger + + * breakpoint.c (breakpoint_re_set_one): Set b->cond, b->val, and + b->exp to NULL after freeing so that error during re-parsing or + evaluation of expressions associated with breakpoint don't + eventually lead to re-freeing of storage. + Committed by Andrew Cagney. + 2004-01-27 Andrew Cagney * source.c (ambiguous_line_spec): Delete undefined declaration. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 7f66a3c3b30..a9bd979adc0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -6970,12 +6970,22 @@ breakpoint_re_set_one (void *bint) /* So for now, just use a global context. */ if (b->exp) - xfree (b->exp); + { + xfree (b->exp); + /* Avoid re-freeing b->exp if an error during the call to + parse_expression. */ + b->exp = NULL; + } b->exp = parse_expression (b->exp_string); b->exp_valid_block = innermost_block; mark = value_mark (); if (b->val) - value_free (b->val); + { + value_free (b->val); + /* Avoid re-freeing b->val if an error during the call to + evaluate_expression. */ + b->val = NULL; + } b->val = evaluate_expression (b->exp); release_value (b->val); if (VALUE_LAZY (b->val) && breakpoint_enabled (b)) @@ -6985,7 +6995,12 @@ breakpoint_re_set_one (void *bint) { s = b->cond_string; if (b->cond) - xfree (b->cond); + { + xfree (b->cond); + /* Avoid re-freeing b->exp if an error during the call + to parse_exp_1. */ + b->cond = NULL; + } b->cond = parse_exp_1 (&s, (struct block *) 0, 0); } if (breakpoint_enabled (b))