From e1507e953ec06f50f83f0bbc2b50a7f3b11f4022 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 22 Aug 2012 16:44:45 +0000 Subject: [PATCH] * jit.c (jit_object_close_impl): Don't malloc the objfile name. * objfiles.c (allocate_objfile): Don't malloc the objfile name. (free_objfile): Don't free the objfile name. * objfiles.h (struct objfile) : Update comment. * symfile.c (reread_symbols): Fix reference counting. Don't malloc objfile name. --- gdb/ChangeLog | 11 +++++++++++ gdb/jit.c | 3 +-- gdb/objfiles.c | 5 ++--- gdb/objfiles.h | 5 +++-- gdb/symfile.c | 15 ++++++++++----- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2f54efc..b0520e1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2012-08-22 Tom Tromey + * jit.c (jit_object_close_impl): Don't malloc the objfile + name. + * objfiles.c (allocate_objfile): Don't malloc the objfile + name. + (free_objfile): Don't free the objfile name. + * objfiles.h (struct objfile) : Update comment. + * symfile.c (reread_symbols): Fix reference counting. Don't + malloc objfile name. + +2012-08-22 Tom Tromey + * windows-nat.c (windows_make_so): Use gdb_bfd_open. * symfile.c (bfd_open_maybe_remote): Use gdb_bfd_open. (symfile_bfd_open): Likewise. diff --git a/gdb/jit.c b/gdb/jit.c index 26de189..9e8f295 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -761,8 +761,7 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb, terminate_minimal_symbol_table (objfile); - xfree (objfile->name); - objfile->name = xstrdup ("<< JIT compiled code >>"); + objfile->name = "<< JIT compiled code >>"; j = NULL; for (i = obj->symtabs; i; i = j) diff --git a/gdb/objfiles.c b/gdb/objfiles.c index d5317a8..a1db8c6 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -271,7 +271,7 @@ allocate_objfile (bfd *abfd, int flags) /* Look up the gdbarch associated with the BFD. */ objfile->gdbarch = gdbarch_from_bfd (abfd); - objfile->name = xstrdup (bfd_get_filename (abfd)); + objfile->name = bfd_get_filename (abfd); objfile->mtime = bfd_get_mtime (abfd); /* Build section table. */ @@ -279,7 +279,7 @@ allocate_objfile (bfd *abfd, int flags) } else { - objfile->name = xstrdup ("<>"); + objfile->name = "<>"; } objfile->per_bfd = get_objfile_bfd_data (objfile, abfd); @@ -670,7 +670,6 @@ free_objfile (struct objfile *objfile) /* The last thing we do is free the objfile struct itself. */ - xfree (objfile->name); if (objfile->global_psymbols.list) xfree (objfile->global_psymbols.list); if (objfile->static_psymbols.list) diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 24124fe..304f935 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -197,8 +197,9 @@ struct objfile struct objfile *next; - /* The object file's name, tilde-expanded and absolute. Malloc'd; free it - if you free this struct. This pointer is never NULL. */ + /* The object file's name, tilde-expanded and absolute. This + pointer is never NULL. This does not have to be freed; it is + guaranteed to have a lifetime at least as long as the objfile. */ char *name; diff --git a/gdb/symfile.c b/gdb/symfile.c index 7c202b5..a07f84c 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2506,9 +2506,7 @@ reread_symbols (void) clear_objfile_data (objfile); - /* Clean up any state BFD has sitting around. We don't need - to close the descriptor but BFD lacks a way of closing the - BFD without closing the descriptor. */ + /* Clean up any state BFD has sitting around. */ { struct bfd *obfd = objfile->obfd; @@ -2516,11 +2514,18 @@ reread_symbols (void) /* Open the new BFD before freeing the old one, so that the filename remains live. */ objfile->obfd = gdb_bfd_open_maybe_remote (obfd_filename); + if (objfile->obfd == NULL) + { + /* We have to make a cleanup and error here, rather + than erroring later, because once we unref OBFD, + OBFD_FILENAME will be freed. */ + make_cleanup_bfd_unref (obfd); + error (_("Can't open %s to read symbols."), obfd_filename); + } gdb_bfd_unref (obfd); } - if (objfile->obfd == NULL) - error (_("Can't open %s to read symbols."), objfile->name); + objfile->name = bfd_get_filename (objfile->obfd); /* bfd_openr sets cacheable to true, which is what we want. */ if (!bfd_check_format (objfile->obfd, bfd_object)) error (_("Can't read symbols from %s: %s."), objfile->name, -- 2.7.4