diff --git a/gold/ChangeLog b/gold/ChangeLog index e1e126abf6..524340d341 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,17 @@ +2010-04-07 Cary Coutant + + * archive.cc (include_member): Destroy Read_symbols_data object before + releasing file. + * object.cc (Read_symbols_data::~Read_symbols_data) New destructor. + * object.h (Read_symbols_data::Read_symbols_data) New constructor. + (Read_symbols_data::~Read_symbols_data) New destructor. + (Section_relocs::Section_relocs) New constructor. + (Section_relocs::~Section_relocs) New destructor. + (Read_relocs_data::Read_relocs_data) New constructor. + (Read_relocs_data::~Read_relocs_data) New destructor. + * testsuite/binary_unittest.cc (Sized_binary_test): Set sd member + pointers to NULL after deleting. + 2010-04-07 Doug Kwan * arm.cc: Replace "endianity" with "endianness" in comments. diff --git a/gold/archive.cc b/gold/archive.cc index c62fb247b9..36e4862871 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -877,10 +877,12 @@ Archive::include_member(Symbol_table* symtab, Layout* layout, delete obj; else { - Read_symbols_data sd; - obj->read_symbols(&sd); - obj->layout(symtab, layout, &sd); - obj->add_symbols(symtab, &sd, layout); + { + Read_symbols_data sd; + obj->read_symbols(&sd); + obj->layout(symtab, layout, &sd); + obj->add_symbols(symtab, &sd, layout); + } // If this is an external member of a thin archive, unlock the file // for the next task. diff --git a/gold/object.cc b/gold/object.cc index b9d00280ce..8751d550f1 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -43,6 +43,28 @@ namespace gold { +// Struct Read_symbols_data. + +// Destroy any remaining File_view objects. + +Read_symbols_data::~Read_symbols_data() +{ + if (this->section_headers != NULL) + delete this->section_headers; + if (this->section_names != NULL) + delete this->section_names; + if (this->symbols != NULL) + delete this->symbols; + if (this->symbol_names != NULL) + delete this->symbol_names; + if (this->versym != NULL) + delete this->versym; + if (this->verdef != NULL) + delete this->verdef; + if (this->verneed != NULL) + delete this->verneed; +} + // Class Xindex. // Initialize the symtab_xindex_ array. Find the SHT_SYMTAB_SHNDX diff --git a/gold/object.h b/gold/object.h index dc0cb2d71d..02747a7caa 100644 --- a/gold/object.h +++ b/gold/object.h @@ -55,6 +55,13 @@ class Stringpool_template; struct Read_symbols_data { + Read_symbols_data() + : section_headers(NULL), section_names(NULL), symbols(NULL), + symbol_names(NULL), versym(NULL), verdef(NULL), verneed(NULL) + { } + + ~Read_symbols_data(); + // Section headers. File_view* section_headers; // Section names. @@ -102,6 +109,13 @@ struct Symbol_location_info struct Section_relocs { + Section_relocs() + : contents(NULL) + { } + + ~Section_relocs() + { delete this->contents; } + // Index of reloc section. unsigned int reloc_shndx; // Index of section that relocs apply to. @@ -125,6 +139,13 @@ struct Section_relocs struct Read_relocs_data { + Read_relocs_data() + : local_symbols(NULL) + { } + + ~Read_relocs_data() + { delete this->local_symbols; } + typedef std::vector Relocs_list; // The relocations. Relocs_list relocs; diff --git a/gold/testsuite/binary_unittest.cc b/gold/testsuite/binary_unittest.cc index b2e14df645..8e950620c9 100644 --- a/gold/testsuite/binary_unittest.cc +++ b/gold/testsuite/binary_unittest.cc @@ -87,9 +87,13 @@ Sized_binary_test() Read_symbols_data sd; object->read_symbols(&sd); delete sd.section_headers; + sd.section_headers = NULL; delete sd.section_names; + sd.section_names = NULL; delete sd.symbols; + sd.symbols = NULL; delete sd.symbol_names; + sd.symbol_names = NULL; Sized_relobj* relobj = static_cast*>(object);