summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2013-05-22 21:16:17 +0000
committerKeith Seitz <keiths@redhat.com>2013-05-22 21:16:17 +0000
commit6fcd25589f95ed1c663b4993b5faa47fad2389d4 (patch)
tree6df1b09621ac5b661cb09f20ed5afb80516c1daf /gdb
parent72de6e69758282b35491e7289d368eb7542f638f (diff)
downloadgdb-6fcd25589f95ed1c663b4993b5faa47fad2389d4.tar.gz
* ada-lang.c (is_known_support_routine): Add explicit free of
'func_name' from find_frame_funname. (ada_unhandled_exception_name_addr_from_raise): Add cleanups for func_name from find_frame_funname. * python/py-frame.c (frapy_name): Add explicit free of 'name' from find_frame_funname. * stack.c (find_frame_funname): Add comment explaining that funcp must be freed by the caller. Return copy of symbol names instead of pointers. (print_frame): Add a cleanup for 'funname' from find_frame_funname. * stack.h (find_frame_funname): Remove "const" from 'funname' parameter.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/ada-lang.c26
-rw-r--r--gdb/python/py-frame.c11
-rw-r--r--gdb/stack.c15
-rw-r--r--gdb/stack.h2
5 files changed, 53 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3b2551bc6c6..9ca55d7f81f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,19 @@
+2013-05-22 Keith Seitz <keiths@redhat.com>
+
+ * ada-lang.c (is_known_support_routine): Add explicit free of
+ 'func_name' from find_frame_funname.
+ (ada_unhandled_exception_name_addr_from_raise): Add cleanups
+ for func_name from find_frame_funname.
+ * python/py-frame.c (frapy_name): Add explicit free of
+ 'name' from find_frame_funname.
+ * stack.c (find_frame_funname): Add comment explaining that
+ funcp must be freed by the caller.
+ Return copy of symbol names instead of pointers.
+ (print_frame): Add a cleanup for 'funname' from
+ find_frame_funname.
+ * stack.h (find_frame_funname): Remove "const" from
+ 'funname' parameter.
+
2013-05-22 Tom Tromey <tromey@redhat.com>
PR c++/15401:
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index b6d5e0b71a5..8240fee0e18 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -11113,7 +11113,7 @@ static int
is_known_support_routine (struct frame_info *frame)
{
struct symtab_and_line sal;
- const char *func_name;
+ char *func_name;
enum language func_lang;
int i;
const char *fullname;
@@ -11160,9 +11160,13 @@ is_known_support_routine (struct frame_info *frame)
{
re_comp (known_auxiliary_function_name_patterns[i]);
if (re_exec (func_name))
- return 1;
+ {
+ xfree (func_name);
+ return 1;
+ }
}
+ xfree (func_name);
return 0;
}
@@ -11206,6 +11210,7 @@ ada_unhandled_exception_name_addr_from_raise (void)
int frame_level;
struct frame_info *fi;
struct ada_inferior_data *data = get_ada_inferior_data (current_inferior ());
+ struct cleanup *old_chain;
/* To determine the name of this exception, we need to select
the frame corresponding to RAISE_SYM_NAME. This frame is
@@ -11216,17 +11221,24 @@ ada_unhandled_exception_name_addr_from_raise (void)
if (fi != NULL)
fi = get_prev_frame (fi);
+ old_chain = make_cleanup (null_cleanup, NULL);
while (fi != NULL)
{
- const char *func_name;
+ char *func_name;
enum language func_lang;
find_frame_funname (fi, &func_name, &func_lang, NULL);
- if (func_name != NULL
- && strcmp (func_name, data->exception_info->catch_exception_sym) == 0)
- break; /* We found the frame we were looking for... */
- fi = get_prev_frame (fi);
+ if (func_name != NULL)
+ {
+ make_cleanup (xfree, func_name);
+
+ if (strcmp (func_name,
+ data->exception_info->catch_exception_sym) == 0)
+ break; /* We found the frame we were looking for... */
+ fi = get_prev_frame (fi);
+ }
}
+ do_cleanups (old_chain);
if (fi == NULL)
return 0;
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index cf7cc27726a..c29d626cbdf 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -122,7 +122,7 @@ static PyObject *
frapy_name (PyObject *self, PyObject *args)
{
struct frame_info *frame;
- const char *name;
+ char *name = NULL;
enum language lang;
PyObject *result;
volatile struct gdb_exception except;
@@ -133,10 +133,17 @@ frapy_name (PyObject *self, PyObject *args)
find_frame_funname (frame, &name, &lang, NULL);
}
+
+ if (except.reason < 0)
+ xfree (name);
+
GDB_PY_HANDLE_EXCEPTION (except);
if (name)
- result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
+ {
+ result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
+ xfree (name);
+ }
else
{
result = Py_None;
diff --git a/gdb/stack.c b/gdb/stack.c
index d10e9b49d02..a4b392e563b 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1004,10 +1004,10 @@ get_last_displayed_sal (struct symtab_and_line *sal)
/* Attempt to obtain the FUNNAME, FUNLANG and optionally FUNCP of the function
- corresponding to FRAME. */
+ corresponding to FRAME. FUNNAME needs to be freed by the caller. */
void
-find_frame_funname (struct frame_info *frame, const char **funname,
+find_frame_funname (struct frame_info *frame, char **funname,
enum language *funlang, struct symbol **funcp)
{
struct symbol *func;
@@ -1055,12 +1055,12 @@ find_frame_funname (struct frame_info *frame, const char **funname,
/* We also don't know anything about the function besides
its address and name. */
func = 0;
- *funname = SYMBOL_PRINT_NAME (msymbol.minsym);
+ *funname = xstrdup (SYMBOL_PRINT_NAME (msymbol.minsym));
*funlang = SYMBOL_LANGUAGE (msymbol.minsym);
}
else
{
- *funname = SYMBOL_PRINT_NAME (func);
+ *funname = xstrdup (SYMBOL_PRINT_NAME (func));
*funlang = SYMBOL_LANGUAGE (func);
if (funcp)
*funcp = func;
@@ -1075,8 +1075,8 @@ find_frame_funname (struct frame_info *frame, const char **funname,
if (func_only)
{
+ xfree (*funname);
*funname = func_only;
- make_cleanup (xfree, func_only);
}
}
}
@@ -1092,7 +1092,7 @@ find_frame_funname (struct frame_info *frame, const char **funname,
msymbol = lookup_minimal_symbol_by_pc (pc);
if (msymbol.minsym != NULL)
{
- *funname = SYMBOL_PRINT_NAME (msymbol.minsym);
+ *funname = xstrdup (SYMBOL_PRINT_NAME (msymbol.minsym));
*funlang = SYMBOL_LANGUAGE (msymbol.minsym);
}
}
@@ -1105,7 +1105,7 @@ print_frame (struct frame_info *frame, int print_level,
{
struct gdbarch *gdbarch = get_frame_arch (frame);
struct ui_out *uiout = current_uiout;
- const char *funname = NULL;
+ char *funname = NULL;
enum language funlang = language_unknown;
struct ui_file *stb;
struct cleanup *old_chain, *list_chain;
@@ -1120,6 +1120,7 @@ print_frame (struct frame_info *frame, int print_level,
old_chain = make_cleanup_ui_file_delete (stb);
find_frame_funname (frame, &funname, &funlang, &func);
+ make_cleanup (xfree, funname);
annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
gdbarch, pc);
diff --git a/gdb/stack.h b/gdb/stack.h
index 841ad4377b2..4badf195d3f 100644
--- a/gdb/stack.h
+++ b/gdb/stack.h
@@ -22,7 +22,7 @@
void select_frame_command (char *level_exp, int from_tty);
-void find_frame_funname (struct frame_info *frame, const char **funname,
+void find_frame_funname (struct frame_info *frame, char **funname,
enum language *funlang, struct symbol **funcp);
typedef void (*iterate_over_block_arg_local_vars_cb) (const char *print_name,