This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix leak of auto_obstack objfile_per_bfd_storage->storage_obstack;


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5ca79eae06a692cca5bb795045ffb8961e2b8ae8

commit 5ca79eae06a692cca5bb795045ffb8961e2b8ae8
Author: Philippe Waroquiers <philippe.waroquiers@skynet.be>
Date:   Tue Sep 5 20:51:23 2017 +0200

    Fix leak of auto_obstack objfile_per_bfd_storage->storage_obstack;
    
      commit 23732b1e32dd58f7c731d9aee56ff0b22a645d53
      Author: Pedro Alves <palves@redhat.com>
      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<objfile_flag>) (objfiles.c:423)
    ==24665==    by 0x647753: symbol_file_add_with_addrs(bfd*, char const*, enum_flags<symfile_add_flag>, section_addr_info*, enum_flags<objfile_flag>, objfile*) (symfile.c:1158)
    ==24665==    by 0x647C7B: symbol_file_add_separate(bfd*, char const*, enum_flags<symfile_add_flag>, objfile*) (symfile.c:1252)
    ==24665==    by 0x4C7D79: elf_symfile_read(objfile*, enum_flags<symfile_add_flag>) (elfread.c:1270)
    ==24665==    by 0x647CB4: read_symbols(objfile*, enum_flags<symfile_add_flag>) (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  <philippe.waroquiers@skynet.be>
    
    	* objfiles.c (get_objfile_bfd_data): Remove useless obstack_init
    	call.

Diff:
---
 gdb/ChangeLog  | 5 +++++
 gdb/objfiles.c | 1 -
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7e3a7ea..6d2eae5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-05  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+	* objfiles.c (get_objfile_bfd_data): Remove useless obstack_init
+	call.
+
 2017-09-05  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* infrun.c (follow_exec): Call add_thread after
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index c49c7ea..96634b3 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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]