From 5778530ea76fb119f3a77b0c699aa938369bc063 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 24 Jul 2008 07:23:20 +0000 Subject: [PATCH] * stringpool.cc (Stringpool_template::add_with_length): Set key to array size plus one. (Stringpool_template::set_string_offsets): Subtract one from key before using it as an array index. (Stringpool_template::get_offset_with_length): Likewise. (Stringpool_template::write_to_buffer): Likewise. * stringpool.h (Stringpool_template::get_offset_from_key): Likewise. --- gold/ChangeLog | 11 +++++++++++ gold/stringpool.cc | 11 ++++++----- gold/stringpool.h | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index a1458995d30..3d5d94a7f9c 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,14 @@ +2008-07-24 Ian Lance Taylor + + * stringpool.cc (Stringpool_template::add_with_length): Set key to + array size plus one. + (Stringpool_template::set_string_offsets): Subtract one from key + before using it as an array index. + (Stringpool_template::get_offset_with_length): Likewise. + (Stringpool_template::write_to_buffer): Likewise. + * stringpool.h (Stringpool_template::get_offset_from_key): + Likewise. + 2008-07-23 Ian Lance Taylor PR 6658 diff --git a/gold/stringpool.cc b/gold/stringpool.cc index 0d0c904c113..e37846b9edc 100644 --- a/gold/stringpool.cc +++ b/gold/stringpool.cc @@ -248,7 +248,8 @@ Stringpool_template::add_with_length(const Stringpool_char* s, { typedef std::pair Insert_type; - const Key k = this->key_to_offset_.size(); + // We add 1 so that 0 is always invalid. + const Key k = this->key_to_offset_.size() + 1; if (!copy) { @@ -400,7 +401,7 @@ Stringpool_template::set_string_offsets() curr != this->string_set_.end(); curr++) { - section_offset_type* poff = &this->key_to_offset_[curr->second]; + section_offset_type* poff = &this->key_to_offset_[curr->second - 1]; if (this->zero_null_ && curr->first.string[0] == 0) *poff = 0; else @@ -446,7 +447,7 @@ Stringpool_template::set_string_offsets() this_offset = offset; offset += ((*curr)->first.length + 1) * charsize; } - this->key_to_offset_[(*curr)->second] = this_offset; + this->key_to_offset_[(*curr)->second - 1] = this_offset; last_offset = this_offset; } } @@ -475,7 +476,7 @@ Stringpool_template::get_offset_with_length( Hashkey hk(s, length); typename String_set_type::const_iterator p = this->string_set_.find(hk); if (p != this->string_set_.end()) - return this->key_to_offset_[p->second]; + return this->key_to_offset_[p->second - 1]; gold_unreachable(); } @@ -496,7 +497,7 @@ Stringpool_template::write_to_buffer( ++p) { const int len = (p->first.length + 1) * sizeof(Stringpool_char); - const section_offset_type offset = this->key_to_offset_[p->second]; + const section_offset_type offset = this->key_to_offset_[p->second - 1]; gold_assert(static_cast(offset) + len <= this->strtab_size_); memcpy(buffer + offset, p->first.string, len); diff --git a/gold/stringpool.h b/gold/stringpool.h index 1b80842a983..6fe2066eaa4 100644 --- a/gold/stringpool.h +++ b/gold/stringpool.h @@ -220,8 +220,8 @@ class Stringpool_template section_offset_type get_offset_from_key(Key k) const { - gold_assert(k < this->key_to_offset_.size()); - return this->key_to_offset_[k]; + gold_assert(k <= this->key_to_offset_.size()); + return this->key_to_offset_[k - 1]; } // Get the size of the string table. This returns the number of -- 2.30.2