From 55b87a526f450f811090fe38c80965ac615bf661 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Wed, 22 May 2013 21:16:18 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 16 ++++++++++++++++ gdb/ada-lang.c | 26 +++++++++++++++++++------- gdb/python/py-frame.c | 11 +++++++++-- gdb/stack.c | 15 ++++++++------- gdb/stack.h | 2 +- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3b2551bc6c..9ca55d7f81 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2013-05-22 Keith Seitz + + * 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 PR c++/15401: diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index b6d5e0b71a..8240fee0e1 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 cf7cc27726..c29d626cbd 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 d10e9b49d0..a4b392e563 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 841ad4377b..4badf195d3 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, -- 2.34.1