This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: Avoid Stringpool index zero


A gold Stringpool has a key for each string.  The key is not supposed
to have the value zero, as that is used as an invalid value.
Unfortunately, it could happen in some cases.  It mostly doesn't
matter, but it can matter if the very first symbol we see happens to
have a version.  I noticed this while testing a Linux kernel build.

I committed this patch to fix the problem.

Ian


2008-07-24  Ian Lance Taylor  <iant@google.com>

	* 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.


Index: stringpool.h
===================================================================
RCS file: /cvs/src/src/gold/stringpool.h,v
retrieving revision 1.21
diff -u -p -r1.21 stringpool.h
--- stringpool.h	13 Mar 2008 21:04:21 -0000	1.21
+++ stringpool.h	24 Jul 2008 07:19:22 -0000
@@ -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
Index: stringpool.cc
===================================================================
RCS file: /cvs/src/src/gold/stringpool.cc,v
retrieving revision 1.27
diff -u -p -r1.27 stringpool.cc
--- stringpool.cc	13 Mar 2008 21:04:21 -0000	1.27
+++ stringpool.cc	24 Jul 2008 07:19:22 -0000
@@ -248,7 +248,8 @@ Stringpool_template<Stringpool_char>::ad
 {
   typedef std::pair<typename String_set_type::iterator, bool> 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<Stringpool_char>::se
            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<Stringpool_char>::se
               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<Stringpool_char>::ge
   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<Stringpool_char>::wr
        ++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<section_size_type>(offset) + len
 		  <= this->strtab_size_);
       memcpy(buffer + offset, p->first.string, len);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]