commit: de6868dc18e5f0a9471d357ab9906eef83a3149e
Author: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org>
AuthorDate: Fri May 1 21:43:42 2020 +0000
Commit: Sergei Trofimovich <slyfox <AT> gentoo <DOT> org>
CommitDate: Fri May 1 21:43:58 2020 +0000
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=de6868dc
sys-devel/binutils: fix RISC-V ld crash, bug #720280
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 <AT> gentoo.org>
sys-devel/binutils/binutils-2.34.ebuild | 1 +
.../binutils/files/binutils-2.34-riscv-SEGV.patch | 40 ++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/sys-devel/binutils/binutils-2.34.ebuild
b/sys-devel/binutils/binutils-2.34.ebuild
index 805c709df2a..40a250edf7b 100644
--- a/sys-devel/binutils/binutils-2.34.ebuild
+++ b/sys-devel/binutils/binutils-2.34.ebuild
@@ -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
index 00000000000..ac70e504918
--- /dev/null
+++ b/sys-devel/binutils/files/binutils-2.34-riscv-SEGV.patch
@@ -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 <[email protected]>
+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
+