From 019cdb1a59d66739843fdb0e6221566bcf7d60bd Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 7 Nov 2007 00:31:32 +0000 Subject: [PATCH] From Craig Silverstein: Don't crash if we see a file we don't recognize. --- gold/archive.cc | 17 ++++++++++++----- gold/object.cc | 18 +++++++++--------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/gold/archive.cc b/gold/archive.cc index 4d95b7901d6..5862f34a6f6 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -399,12 +399,19 @@ Archive::include_member(Symbol_table* symtab, Layout* layout, this->input_file_, memoff, ehdr_buf, read_size); - input_objects->add_object(obj); + if (input_objects->add_object(obj)) + { + Read_symbols_data sd; + obj->read_symbols(&sd); + obj->layout(symtab, layout, &sd); + obj->add_symbols(symtab, &sd); + } + else + { + // FIXME: We need to close the descriptor here. + delete obj; + } - Read_symbols_data sd; - obj->read_symbols(&sd); - obj->layout(symtab, layout, &sd); - obj->add_symbols(symtab, &sd); } // Add_archive_symbols methods. diff --git a/gold/object.cc b/gold/object.cc index 58f0db08242..8efd4ec7e35 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -866,6 +866,15 @@ Sized_relobj::get_symbol_location_info( bool Input_objects::add_object(Object* obj) { + Target* target = obj->target(); + if (this->target_ == NULL) + this->target_ = target; + else if (this->target_ != target) + { + gold_error(_("%s: incompatible target"), obj->name().c_str()); + return false; + } + if (!obj->is_dynamic()) this->relobj_list_.push_back(static_cast(obj)); else @@ -884,15 +893,6 @@ Input_objects::add_object(Object* obj) this->dynobj_list_.push_back(dynobj); } - Target* target = obj->target(); - if (this->target_ == NULL) - this->target_ = target; - else if (this->target_ != target) - { - gold_error(_("%s: incompatible target"), obj->name().c_str()); - return false; - } - set_parameters_size_and_endianness(target->get_size(), target->is_big_endian()); -- 2.30.2