[binutils-gdb] Re: PR26656, power10 libstdc++.so segfault in __cxxabiv1::__cxa_throw

Alan Modra amodra@sourceware.org
Mon Sep 28 00:12:23 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=12cf8b93da0ae155643d262235486fde5af72a80

commit 12cf8b93da0ae155643d262235486fde5af72a80
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Sep 28 09:30:19 2020 +0930

    Re: PR26656, power10 libstdc++.so segfault in __cxxabiv1::__cxa_throw
    
    Some missing NULL checks meant a stub for a local symbol used a stub
    looking like the __tls_get_addr_opt stub.
    
            PR 26656
            * elf64-ppc.c (ppc_build_one_stub, ppc_size_one_stub): Check for
            NULL stub_entry->h before calling is_tls_get_addr.

Diff:
---
 bfd/ChangeLog   | 6 ++++++
 bfd/elf64-ppc.c | 5 ++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8d0e695422a..4222ebbf5c6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-09-28  Alan Modra  <amodra@gmail.com>
+
+	PR 26656
+	* elf64-ppc.c (ppc_build_one_stub, ppc_size_one_stub): Check for
+	NULL stub_entry->h before calling is_tls_get_addr.
+
 2020-09-26  Alan Modra  <amodra@gmail.com>
 
 	* elf64-ppc.c (GLINK_PLTRESOLVE_SIZE): Depend on has_plt_localentry0.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 4194802d48b..35f3cbef1ef 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -11678,6 +11678,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
       obfd = htab->params->stub_bfd;
       is_tga = ((stub_entry->stub_type == ppc_stub_plt_call_notoc
 		 || stub_entry->stub_type == ppc_stub_plt_call_both)
+		&& stub_entry->h != NULL
 		&& is_tls_get_addr (&stub_entry->h->elf, htab)
 		&& htab->params->tls_get_addr_opt);
       if (is_tga)
@@ -12188,7 +12189,8 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
     case ppc_stub_plt_call_notoc:
     case ppc_stub_plt_call_both:
       lr_used = 0;
-      if (is_tls_get_addr (&stub_entry->h->elf, htab)
+      if (stub_entry->h != NULL
+	  && is_tls_get_addr (&stub_entry->h->elf, htab)
 	  && htab->params->tls_get_addr_opt)
 	{
 	  lr_used += 7 * 4;
@@ -12258,6 +12260,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 	}
       if ((stub_entry->stub_type == ppc_stub_plt_call_notoc
 	   || stub_entry->stub_type == ppc_stub_plt_call_both)
+	  && stub_entry->h != NULL
 	  && is_tls_get_addr (&stub_entry->h->elf, htab)
 	  && htab->params->tls_get_addr_opt)
 	{


More information about the Binutils-cvs mailing list