Fix potential crashes when Target::make_symbol() returns NULL.
authorJames Clarke <jrtc27@jrtc27.com>
Wed, 10 Aug 2016 16:58:01 +0000 (09:58 -0700)
committerCary Coutant <ccoutant@gmail.com>
Wed, 10 Aug 2016 16:58:01 +0000 (09:58 -0700)
2016-08-10  James Clarke  <jrtc27@jrtc27.com>

gold/
PR gold/20443
* symtab.cc (Symbol_table::add_from_relobj): Handle NULL symbols,
which will be present for STT_SPARC_REGISTER.
(Symbol_table::add_from_pluginobj): Likewise.
(Symbol_table::add_from_dynobj): Likewise.
(Symbol_table::add_from_incrobj): Removed dead code.

gold/ChangeLog
gold/symtab.cc

index d0a670b1df73bc32b7946e85cb1df3bfeb252a10..10677c762c2249370b109534c5c7284a23732ec0 100644 (file)
@@ -1,3 +1,12 @@
+2016-08-10  James Clarke  <jrtc27@jrtc27.com>
+
+       PR gold/20443
+       * symtab.cc (Symbol_table::add_from_relobj): Handle NULL symbols,
+       which will be present for STT_SPARC_REGISTER.
+       (Symbol_table::add_from_pluginobj): Likewise.
+       (Symbol_table::add_from_dynobj): Likewise.
+       (Symbol_table::add_from_incrobj): Removed dead code.
+
 2016-08-10  James Clarke  <jrtc27@jrtc27.com>
 
        PR gold/20442
index 5ce5c31bfee4d344386b6d445bb92e04fc31864b..b31794a5a8cd49f7737473015a933418effe1600 100644 (file)
@@ -1325,6 +1325,9 @@ Symbol_table::add_from_relobj(
       res = this->add_from_object(relobj, name, name_key, ver, ver_key,
                                  is_default_version, *psym, st_shndx,
                                  is_ordinary, orig_st_shndx);
+
+      if (res == NULL)
+       continue;
       
       if (is_forced_local)
        this->force_local(res);
@@ -1406,6 +1409,9 @@ Symbol_table::add_from_pluginobj(
                              is_default_version, *sym, st_shndx,
                              is_ordinary, st_shndx);
 
+  if (res == NULL)
+    return NULL;
+
   if (is_forced_local)
     this->force_local(res);
 
@@ -1602,6 +1608,9 @@ Symbol_table::add_from_dynobj(
            }
        }
 
+      if (res == NULL)
+       continue;
+
       // Note that it is possible that RES was overridden by an
       // earlier object, in which case it can't be aliased here.
       if (st_shndx != elfcpp::SHN_UNDEF
@@ -1640,7 +1649,6 @@ Symbol_table::add_from_incrobj(
 
   Stringpool::Key ver_key = 0;
   bool is_default_version = false;
-  bool is_forced_local = false;
 
   Stringpool::Key name_key;
   name = this->namepool_.add(name, true, &name_key);
@@ -1650,9 +1658,6 @@ Symbol_table::add_from_incrobj(
                              is_default_version, *sym, st_shndx,
                              is_ordinary, st_shndx);
 
-  if (is_forced_local)
-    this->force_local(res);
-
   return res;
 }