From 9cd2307aff9fc1ec8eef77b1082e5465efba9681 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 24 Nov 2008 17:05:42 +0000 Subject: Fix access of an already freed memory. * parse.c (parse_field_expression): Call xstrdup on `*name'. * completer.c (expression_completer): Free fieldname. --- gdb/parse.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gdb/parse.c') diff --git a/gdb/parse.c b/gdb/parse.c index 6200e8162fa..3575306d3b7 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1090,7 +1090,8 @@ parse_expression (char *string) /* Parse STRING as an expression. If parsing ends in the middle of a field reference, return the type of the left-hand-side of the reference; furthermore, if the parsing ends in the field name, - return the field name in *NAME. In all other cases, return NULL. */ + return the field name in *NAME. In all other cases, return NULL. + Returned non-NULL *NAME must be freed by the caller. */ struct type * parse_field_expression (char *string, char **name) @@ -1120,6 +1121,9 @@ parse_field_expression (char *string, char **name) xfree (exp); return NULL; } + /* (*NAME) is a part of the EXP memory block freed below. */ + *name = xstrdup (*name); + val = evaluate_subexpression_type (exp, subexp); xfree (exp); -- cgit v1.2.1