From: Philippe Waroquiers Date: Tue, 5 Sep 2017 18:51:23 +0000 (+0200) Subject: Fix leak of auto_obstack objfile_per_bfd_storage->storage_obstack; X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5ca79eae06a692cca5bb795045ffb8961e2b8ae8;p=binutils-gdb.git Fix leak of auto_obstack objfile_per_bfd_storage->storage_obstack; commit 23732b1e32dd58f7c731d9aee56ff0b22a645d53 Author: Pedro Alves Date: Tue Jun 27 16:22:08 2017 +0100 changed objfile_per_bfd_storage->storage_obstack from 'struct obstack storage_obstack;' to 'auto_obstack storage_obstack;' So the obstack is auto allocated when the objfile_per_bfd_storage ctor is manually called by get_objfile_bfd_data). However, the ctor call was still followed by a manual call to obstack_init (&storage->storage_obstack); This results in a bunch of leaks detected by valgrind, such as: ==24665== 4,064 bytes in 1 blocks are definitely lost in loss record 11,469 of 11,590 ==24665== at 0x4C27BF5: malloc (vg_replace_malloc.c:299) ==24665== by 0x5437B7: xmalloc (common-utils.c:44) ==24665== by 0x77CAA7: _obstack_begin_worker (obstack.c:141) ==24665== by 0x60168F: auto_obstack (gdb_obstack.h:70) ==24665== by 0x60168F: get_objfile_bfd_data(objfile*, bfd*) (objfiles.h:188) ==24665== by 0x601DB6: allocate_objfile(bfd*, char const*, enum_flags) (objfiles.c:423) ==24665== by 0x647753: symbol_file_add_with_addrs(bfd*, char const*, enum_flags, section_addr_info*, enum_flags, objfile*) (symfile.c:1158) ==24665== by 0x647C7B: symbol_file_add_separate(bfd*, char const*, enum_flags, objfile*) (symfile.c:1252) ==24665== by 0x4C7D79: elf_symfile_read(objfile*, enum_flags) (elfread.c:1270) ==24665== by 0x647CB4: read_symbols(objfile*, enum_flags) (symfile.c:861) ==24665== by 0x647809: syms_from_objfile_1 (symfile.c:1062) -> remove the manual call to obstack_init. Reg-tested on Debian 8/amd64, tests results are the same before/after the patch. valgrind still show some leaks, but less. gdb/ChangeLog 2017-09-05 Philippe Waroquiers * objfiles.c (get_objfile_bfd_data): Remove useless obstack_init call. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7e3a7eaebe9..6d2eae58bc8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-09-05 Philippe Waroquiers + + * objfiles.c (get_objfile_bfd_data): Remove useless obstack_init + call. + 2017-09-05 Simon Marchi * infrun.c (follow_exec): Call add_thread after diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c49c7ea2e43..96634b3f052 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -160,7 +160,6 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) if (abfd != NULL) storage->gdbarch = gdbarch_from_bfd (abfd); - obstack_init (&storage->storage_obstack); storage->filename_cache = bcache_xmalloc (NULL, NULL); storage->macro_cache = bcache_xmalloc (NULL, NULL); storage->language_of_main = language_unknown;