diff options
author | Tom Tromey <tom@tromey.com> | 2022-08-02 09:55:32 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2022-08-03 13:26:58 -0600 |
commit | 98badbfdc222d1d7f346046f23a64522b88d22a0 (patch) | |
tree | a57a95b75f64a0e318e0b1bd31dd6b246e4797d8 /gdb/objfiles.h | |
parent | 4d44946794e68cf79cfba467fa414a958dba2185 (diff) | |
download | gdb-98badbfdc222d1d7f346046f23a64522b88d22a0.zip gdb-98badbfdc222d1d7f346046f23a64522b88d22a0.tar.gz gdb-98badbfdc222d1d7f346046f23a64522b88d22a0.tar.bz2 |
Use gdb_bfd_ref_ptr in objfile
This changes struct objfile to use a gdb_bfd_ref_ptr. In addition to
removing some manual memory management, this fixes a use-after-free
that was introduced by the registry rewrite series. The issue there
was that, in some cases, registry shutdown could refer to memory that
had already been freed. This help fix the bug by delaying the
destruction of the BFD reference (and thus the per-bfd object) until
after the registry has been shut down.
Diffstat (limited to 'gdb/objfiles.h')
-rw-r--r-- | gdb/objfiles.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gdb/objfiles.h b/gdb/objfiles.h index e724a4e..eb85ed4 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -401,7 +401,7 @@ struct objfile private: /* The only way to create an objfile is to call objfile::make. */ - objfile (bfd *, const char *, objfile_flags); + objfile (gdb_bfd_ref_ptr, const char *, objfile_flags); public: @@ -414,8 +414,8 @@ public: ~objfile (); /* Create an objfile. */ - static objfile *make (bfd *bfd_, const char *name_, objfile_flags flags_, - objfile *parent = nullptr); + static objfile *make (gdb_bfd_ref_ptr bfd_, const char *name_, + objfile_flags flags_, objfile *parent = nullptr); /* Remove an objfile from the current program space, and free it. */ @@ -597,7 +597,7 @@ public: section. */ gdb_assert (section->owner == nullptr || section->owner == this->obfd); - int idx = gdb_bfd_section_index (this->obfd, section); + int idx = gdb_bfd_section_index (this->obfd.get (), section); return this->section_offsets[idx]; } @@ -608,7 +608,7 @@ public: section. */ gdb_assert (section->owner == nullptr || section->owner == this->obfd); - int idx = gdb_bfd_section_index (this->obfd, section); + int idx = gdb_bfd_section_index (this->obfd.get (), section); this->section_offsets[idx] = offset; } @@ -651,7 +651,7 @@ public: /* The object file's BFD. Can be null if the objfile contains only minimal symbols, e.g. the run time common symbols for SunOS4. */ - bfd *obfd; + gdb_bfd_ref_ptr obfd; /* The per-BFD data. Note that this is treated specially if OBFD is NULL. */ |