[patch] Memory leak fixes
Ali Lakhia
lakhia@alumni.utexas.net
Sat Oct 2 00:16:00 GMT 2010
Please see fixes for memory leaks. My testing for these has been
limited to just making sure things work for my day-to-day use. Thanks,
-Ali
-------------- next part --------------
--- gdb-7.1/bfd/elf32-i386.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/bfd/elf32-i386.c 2010-06-14 15:04:05.000000000 -0700
@@ -835,6 +835,7 @@
ret->loc_hash_memory = objalloc_create ();
if (!ret->loc_hash_table || !ret->loc_hash_memory)
{
+ objalloc_free (ret->loc_hash_memory);
free (ret);
return NULL;
}
diff -ru gdb-7.1/bfd/elf64-x86-64.c gdb-7.1/bfd/elf64-x86-64.c
--- gdb-7.1/bfd/elf64-x86-64.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/bfd/elf64-x86-64.c 2010-06-14 15:01:55.000000000 -0700
@@ -647,6 +647,7 @@
ret->loc_hash_memory = objalloc_create ();
if (!ret->loc_hash_table || !ret->loc_hash_memory)
{
+ objalloc_free (ret->loc_hash_memory);
free (ret);
return NULL;
}
diff -ru gdb-7.1/gdb/dwarf2read.c gdb-7.1/gdb/dwarf2read.c
--- gdb-7.1/gdb/dwarf2read.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/gdb/dwarf2read.c 2010-06-15 14:53:54.000000000 -0700
@@ -5462,6 +5462,7 @@
set_descriptive_type (type, die, cu);
do_cleanups (back_to);
+ xfree (range_types);
/* Install the type in the die. */
return set_die_type (die, type, cu);
diff -ru gdb-7.1/gdb/elfread.c gdb-7.1/gdb/elfread.c
--- gdb-7.1/gdb/elfread.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/gdb/elfread.c 2010-06-15 14:53:54.000000000 -0700
@@ -566,6 +566,7 @@
}
}
}
+ xfree (sectinfo);
}
struct build_id
--- gdb-7.1/gdb/gdbserver/hostio.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/gdb/gdbserver/hostio.c 2010-06-14 12:18:11.000000000 -0700
@@ -367,6 +367,7 @@
|| require_data (p, packet_len - (p - own_buf), &data, &len))
{
hostio_packet_error (own_buf);
+ free (data);
return;
}
--- gdb-7.1/gdb/maint.c 2010-09-14 16:59:40.000000000 -0700
+++ gdb-7.1/gdb/maint.c 2010-06-15 14:53:54.000000000 -0700
@@ -608,8 +608,10 @@
}
if (!start_ptr || !end_ptr)
- replacement = NULL;
-
+ {
+ xfree (replacement);
+ replacement = NULL;
+ }
/* If they used an alias, we only want to deprecate the alias.
diff -ru gdb-7.1/gdb/mi/mi-cmd-disas.c gdb-7.1/gdb/mi/mi-cmd-disas.c
--- gdb-7.1/gdb/mi/mi-cmd-disas.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/mi/mi-cmd-disas.c 2010-06-14 14:43:18.000000000 -0700
@@ -158,4 +158,5 @@
file_string,
mixed_source_and_assembly? DISASSEMBLY_SOURCE : 0,
how_many, low, high);
+ xfree (file_string);
}
diff -ru gdb-7.1/gdb/mi/mi-cmd-env.c gdb-7.1/gdb/mi/mi-cmd-env.c
--- gdb-7.1/gdb/mi/mi-cmd-env.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/mi/mi-cmd-env.c 2010-06-14 11:57:02.000000000 -0700
@@ -276,4 +276,5 @@
if (!env)
env = "";
orig_path = xstrdup (env);
+ free_environ(environment);
}
diff -ru gdb-7.1/gdb/printcmd.c gdb-7.1/gdb/printcmd.c
--- gdb-7.1/gdb/printcmd.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/printcmd.c 2010-06-15 14:53:54.000000000 -0700
@@ -608,6 +608,7 @@
fputs_filtered (">", stream);
do_cleanups (cleanup_chain);
+ xfree (filename);
}
/* Given an address ADDR return all the elements needed to print the
diff -ru gdb-7.1/gdb/python/py-cmd.c gdb-7.1/gdb/python/py-cmd.c
--- gdb-7.1/gdb/python/py-cmd.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/python/py-cmd.c 2010-06-14 14:06:14.000000000 -0700
@@ -431,7 +431,10 @@
pfx_name[out] = '\0';
}
else if (cmp < 0)
- return -1;
+ {
+ xfree (cmd_name);
+ return -1;
+ }
}
if (PyObject_HasAttr (self, gdbpy_doc_cst))
{
diff -ru gdb-7.1/gdb/python/py-type.c gdb-7.1/gdb/python/py-type.c
--- gdb-7.1/gdb/python/py-type.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/python/py-type.c 2010-06-14 14:04:28.000000000 -0700
@@ -580,6 +580,7 @@
type_print (type_object_to_type (self), "", stb, -1);
+ xfree (thetype);
thetype = ui_file_xstrdup (stb, &length);
do_cleanups (old_chain);
}
diff -ru gdb-7.1/gdb/python/py-value.c gdb-7.1/gdb/python/py-value.c
--- gdb-7.1/gdb/python/py-value.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/python/py-value.c 2010-06-14 15:28:18.000000000 -0700
@@ -407,6 +407,7 @@
{
common_val_print (((value_object *) self)->value, stb, 0,
&opts, python_language);
+ xfree (s);
s = ui_file_xstrdup (stb, NULL);
}
GDB_PY_HANDLE_EXCEPTION (except);
diff -ru gdb-7.1/gdb/ser-unix.c gdb-7.1/gdb/ser-unix.c
--- gdb-7.1/gdb/ser-unix.c 2010-09-14 17:03:28.000000000 -0700
+++ gdb-7.1/gdb/ser-unix.c 2010-06-15 14:53:54.000000000 -0700
@@ -183,7 +183,10 @@
state = (struct hardwire_ttystate *) xmalloc (sizeof *state);
if (get_tty_state (scb, state))
- return NULL;
+ {
+ xfree (state);
+ return NULL;
+ }
return (serial_ttystate) state;
}
diff -ru gdb-7.1/gdb/symfile.c gdb-7.1/gdb/symfile.c
--- gdb-7.1/gdb/symfile.c 2010-09-15 14:45:22.000000000 -0700
+++ gdb-7.1/gdb/symfile.c 2010-06-15 14:53:54.000000000 -0700
@@ -2176,6 +2176,7 @@
frameless. */
reinit_frame_cache ();
do_cleanups (my_cleanups);
+ xfree (sect_opts);
}
@@ -2338,9 +2339,6 @@
memset (&objfile->msymbol_demangled_hash, 0,
sizeof (objfile->msymbol_demangled_hash));
- objfile->psymbol_cache = bcache_xmalloc ();
- objfile->macro_cache = bcache_xmalloc ();
- objfile->filename_cache = bcache_xmalloc ();
/* obstack_init also initializes the obstack so it is
empty. We could use obstack_specify_allocation but
gdb_obstack.h specifies the alloc/dealloc
diff -ru gdb-7.1/gdb/target.c gdb-7.1/gdb/target.c
--- gdb-7.1/gdb/target.c 2010-09-14 17:06:46.000000000 -0700
+++ gdb-7.1/gdb/target.c 2010-06-15 14:53:54.000000000 -0700
@@ -1907,16 +1907,21 @@
target_read_stralloc (struct target_ops *ops, enum target_object object,
const char *annex)
{
- gdb_byte *buffer;
+ gdb_byte *buffer = NULL;
LONGEST transferred;
transferred = target_read_alloc_1 (ops, object, annex, &buffer, 1);
if (transferred < 0)
- return NULL;
-
+ {
+ xfree (buffer);
+ return NULL;
+ }
if (transferred == 0)
- return xstrdup ("");
+ {
+ xfree (buffer);
+ return xstrdup ("");
+ }
buffer[transferred] = 0;
if (strlen (buffer) < transferred)
diff -ru gdb-7.1/gdb/top.c gdb-7.1/gdb/top.c
--- gdb-7.1/gdb/top.c 2010-09-14 17:06:46.000000000 -0700
+++ gdb-7.1/gdb/top.c 2010-09-16 14:21:49.000000000 -0700
@@ -960,7 +960,10 @@
immediate_quit--;
if (got_eof)
- return NULL;
+ {
+ xfree (rl); /* Allocated in readline. */
+ return NULL;
+ }
#define SERVER_COMMAND_LENGTH 7
server_command =
diff -ru gdb-7.1/gdb/tracepoint.c gdb-7.1/gdb/tracepoint.c
--- gdb-7.1/gdb/tracepoint.c 2010-09-14 17:06:46.000000000 -0700
+++ gdb-7.1/gdb/tracepoint.c 2010-06-15 14:53:54.000000000 -0700
@@ -1233,7 +1233,11 @@
return NULL;
}
else
- return *str_list;
+ {
+ char **ret = *str_list;
+ xfree (str_list);
+ return ret;
+ }
}
/* Render all actions into gdb protocol. */
@@ -2076,6 +2080,8 @@
error (_("requires an argument (function, line or *addr) to define a scope"));
sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
+ xfree (canonical);
+
if (sals.nelts == 0)
return; /* presumably decode_line_1 has already warned */
@@ -2772,7 +2778,7 @@
sprintf (buf, "%s_%d", namebase, try_num++);
/* We have an available name, create the variable. */
- tsv = create_trace_state_variable (xstrdup (buf));
+ tsv = create_trace_state_variable (buf);
tsv->initial_value = utsv->initial_value;
tsv->builtin = utsv->builtin;
diff -ru gdb-7.1/gdb/tui/tui-regs.c gdb-7.1/gdb/tui/tui-regs.c
--- gdb-7.1/gdb/tui/tui-regs.c 2010-09-14 17:10:06.000000000 -0700
+++ gdb-7.1/gdb/tui/tui-regs.c 2010-06-14 14:23:18.000000000 -0700
@@ -257,6 +257,7 @@
TUI_DATA_WIN->generic.content = (void*) NULL;
TUI_DATA_WIN->generic.content_size = 0;
tui_add_content_elements (&TUI_DATA_WIN->generic, nr_regs);
+ xfree (display_info->regs_content);
display_info->regs_content
= (tui_win_content) TUI_DATA_WIN->generic.content;
display_info->regs_content_count = nr_regs;
diff -ru gdb-7.1/gdb/tui/tui-winsource.c gdb-7.1/gdb/tui/tui-winsource.c
--- gdb-7.1/gdb/tui/tui-winsource.c 2010-09-14 17:10:06.000000000 -0700
+++ gdb-7.1/gdb/tui/tui-winsource.c 2010-06-14 12:52:41.000000000 -0700
@@ -625,6 +625,7 @@
src_line_buf + (line_width * i);
}
+ xfree (src_line_buf);
return TUI_SUCCESS;
}
diff -ru gdb-7.1/gdb/typeprint.c gdb-7.1/gdb/typeprint.c
--- gdb-7.1/gdb/typeprint.c 2010-09-14 17:10:06.000000000 -0700
+++ gdb-7.1/gdb/typeprint.c 2010-06-15 14:53:54.000000000 -0700
@@ -97,6 +97,7 @@
TRY_CATCH (except, RETURN_MASK_ALL)
{
type_print (type, "", stb, -1);
+ xfree (s);
s = ui_file_xstrdup (stb, NULL);
}
if (except.reason < 0)
diff -ru gdb-7.1/gdb/varobj.c gdb-7.1/gdb/varobj.c
--- gdb-7.1/gdb/varobj.c 2010-03-03 10:33:04.000000000 -0800
+++ gdb-7.1/gdb/varobj.c 2010-06-15 14:53:54.000000000 -0700
@@ -760,6 +760,7 @@
mycount);
}
+ xfree (result);
return delcount;
}
@@ -2564,6 +2565,7 @@
thevalue = ui_file_xstrdup (stb, NULL);
do_cleanups (old_chain);
+ xfree (encoding);
return thevalue;
}
diff -ru gdb-7.1/gdb/xml-support.c gdb-7.1/gdb/xml-support.c
--- gdb-7.1/gdb/xml-support.c 2009-12-31 23:31:46.000000000 -0800
+++ gdb-7.1/gdb/xml-support.c 2010-06-15 14:53:54.000000000 -0700
@@ -1077,6 +1077,7 @@
{
warning (_("Read error from \"%s\""), filename);
do_cleanups (back_to);
+ xfree (text);
return NULL;
}
diff -ru gdb-7.1/libiberty/argv.c gdb-7.1/libiberty/argv.c
--- gdb-7.1/libiberty/argv.c 2009-10-08 21:49:48.000000000 -0700
+++ gdb-7.1/libiberty/argv.c 2010-06-14 12:37:06.000000000 -0700
@@ -402,7 +402,7 @@
size_t len;
/* A dynamically allocated buffer used to hold options read from a
response file. */
- char *buffer;
+ char *buffer = NULL;
/* Dynamically allocated storage for the options read from the
response file. */
char **file_argv;
@@ -423,6 +423,7 @@
goto error;
if (fseek (f, 0L, SEEK_SET) == -1)
goto error;
+ xfree (buffer);
buffer = (char *) xmalloc (pos * sizeof (char) + 1);
len = fread (buffer, sizeof (char), pos, f);
if (len != (size_t) pos
--- gdb-7.1/readline/bind.c 2006-05-05 11:26:12.000000000 -0700
+++ gdb-7.1/readline/bind.c 2010-06-14 12:33:46.000000000 -0700
@@ -370,7 +370,10 @@
ic = uc;
if (ic < 0 || ic >= KEYMAP_SIZE)
- return -1;
+ {
+ free (keys);
+ return -1;
+ }
if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
{
@@ -2068,6 +2071,7 @@
}
}
}
+ free (names);
}
/* Print all of the current functions and their bindings to
diff -ru gdb-7.1/readline/kill.c gdb-7.1/readline/kill.c
--- gdb-7.1/readline/kill.c 2006-05-05 11:26:12.000000000 -0700
+++ gdb-7.1/readline/kill.c 2010-06-14 12:30:56.000000000 -0700
@@ -581,6 +581,7 @@
arg = history_arg_extract (count, count, entry->line);
if (!arg || !*arg)
{
+ free (arg);
rl_ding ();
return -1;
}
diff -ru gdb-7.1/readline/util.c gdb-7.1/readline/util.c
--- gdb-7.1/readline/util.c 2006-05-05 11:26:12.000000000 -0700
+++ gdb-7.1/readline/util.c 2010-06-14 11:33:41.000000000 -0700
@@ -185,6 +185,7 @@
{
homedir = tilde_expand ("~");
_rl_replace_text (homedir, start, end);
+ free (homedir);
return (0);
}
else if (rl_line_buffer[start] != '~')
@@ -215,6 +216,7 @@
free (temp);
_rl_replace_text (homedir, start, end);
+ free (homedir);
}
return (0);
More information about the Gdb-patches
mailing list