* ada-lang.c (is_known_support_routine): Add explicit free of
authorKeith Seitz <keiths@redhat.com>
Wed, 22 May 2013 21:16:18 +0000 (21:16 +0000)
committerKeith Seitz <keiths@redhat.com>
Wed, 22 May 2013 21:16:18 +0000 (21:16 +0000)
'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
gdb/ada-lang.c
gdb/python/py-frame.c
gdb/stack.c
gdb/stack.h

index 3b2551bc6c647853d2f001bed175d1c2ebbfa9c3..9ca55d7f81f2aaa004dd237e9e1254f919dab92a 100644 (file)
@@ -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:
index b6d5e0b71a5732afeb34122332b82d96ee75f1aa..8240fee0e18d87e12e252a31b75e82bfd4ae357c 100644 (file)
@@ -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;
index cf7cc27726aaac1433d98006de110e336b3b39e5..c29d626cbdf84fd73628110d94fa6065750c2594 100644 (file)
@@ -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;
index d10e9b49d0289842d983628150958676455ebc9e..a4b392e563b09fbc1fed64795fe02859fb1f915c 100644 (file)
@@ -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);
index 841ad4377b25945d5514ced50e2e422665abc4ab..4badf195d3f844ed96f897aa50a1b811bacf7a63 100644 (file)
@@ -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,