sys-devel/binutils: fix RISC-V ld crash, bug #720280
authorSergei Trofimovich <slyfox@gentoo.org>
Fri, 1 May 2020 21:43:42 +0000 (22:43 +0100)
committerSergei Trofimovich <slyfox@gentoo.org>
Fri, 1 May 2020 21:43:58 +0000 (22:43 +0100)
It's a direct backport of upstream's a2714d6cca1f1c7
("PR25900, RISC-V: null pointer dereference")

Reported-by: David Michael
Closes: https://bugs.gentoo.org/720280
Bug: https://sourceware.org/PR25900
Package-Manager: Portage-2.3.99, Repoman-2.3.22
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
sys-devel/binutils/binutils-2.34.ebuild
sys-devel/binutils/files/binutils-2.34-riscv-SEGV.patch [new file with mode: 0644]

index 805c709df2ad626317b0b35b679f8efc3e6793f3..40a250edf7b03d897bf5942c246ea544f4026e7b 100644 (file)
@@ -86,6 +86,7 @@ RESTRICT="!test? ( test )"
 
 PATCHES=(
        "${FILESDIR}"/${PN}-2.33-gcc-10.patch
+       "${FILESDIR}"/${PN}-2.34-riscv-SEGV.patch
 )
 
 MY_BUILDDIR=${WORKDIR}/build
diff --git a/sys-devel/binutils/files/binutils-2.34-riscv-SEGV.patch b/sys-devel/binutils/files/binutils-2.34-riscv-SEGV.patch
new file mode 100644 (file)
index 0000000..ac70e50
--- /dev/null
@@ -0,0 +1,40 @@
+https://sourceware.org/PR25900
+https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=a2714d6cca1f1c7695f8dc84b49a4a51d1db86c8
+
+From a2714d6cca1f1c7695f8dc84b49a4a51d1db86c8 Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Fri, 1 May 2020 15:32:00 +0930
+Subject: [PATCH] PR25900, RISC-V: null pointer dereference
+
+       PR 25900
+       * elfnn-riscv.c (_bfd_riscv_relax_section): Check root.type before
+       accessing root.u.def of symbols.  Also check root.u.def.section
+       is non-NULL.  Reverse tests so as to make the logic positive.
+
+--- a/bfd/elfnn-riscv.c
++++ b/bfd/elfnn-riscv.c
+@@ -4161,15 +4161,16 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec,
+             symval = 0;
+             sym_sec = bfd_und_section_ptr;
+           }
+-        else if (h->root.u.def.section->output_section == NULL
+-                 || (h->root.type != bfd_link_hash_defined
+-                     && h->root.type != bfd_link_hash_defweak))
+-          continue;
+-        else
++        else if ((h->root.type == bfd_link_hash_defined
++                  || h->root.type == bfd_link_hash_defweak)
++                 && h->root.u.def.section != NULL
++                 && h->root.u.def.section->output_section != NULL)
+           {
+             symval = h->root.u.def.value;
+             sym_sec = h->root.u.def.section;
+           }
++        else
++          continue;
+         if (h->type != STT_FUNC)
+           reserve_size =
+-- 
+2.18.2
+