diff options
author | Keith Seitz <keiths@redhat.com> | 2013-05-22 21:16:18 +0000 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2013-05-22 21:16:18 +0000 |
commit | 55b87a526f450f811090fe38c80965ac615bf661 (patch) | |
tree | 6db6ba6c14b5aa8471998374dcc7dd5fadecf9b0 /gdb | |
parent | 5f2e6b00f863fc8f334d2506b96b055ef70394ed (diff) | |
download | gdb-55b87a526f450f811090fe38c80965ac615bf661.zip gdb-55b87a526f450f811090fe38c80965ac615bf661.tar.gz gdb-55b87a526f450f811090fe38c80965ac615bf661.tar.bz2 |
* 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/ChangeLog | 16 | ||||
-rw-r--r-- | gdb/ada-lang.c | 26 | ||||
-rw-r--r-- | gdb/python/py-frame.c | 11 | ||||
-rw-r--r-- | gdb/stack.c | 15 | ||||
-rw-r--r-- | gdb/stack.h | 2 |
5 files changed, 53 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3b2551b..9ca55d7 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 b6d5e0b..8240fee 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 cf7cc27..c29d626 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 d10e9b4..a4b392e 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 841ad43..4badf19 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, |