This is the mail archive of the binutils-cvs@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]

[binutils-gdb/binutils-2_31-branch] Visium: fix bogus overflow check on 32-bit hosts


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

commit 1c92e98f548b70b08f01cf512ed755ef84e6f223
Author: Eric Botcazou <ebotcazou@gcc.gnu.org>
Date:   Thu Feb 7 17:02:24 2019 +0100

    Visium: fix bogus overflow check on 32-bit hosts
    
    bfd/
    	* elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak.
    	<R_VISIUM_PC16>: Use explicit range test to detect an overflow.

Diff:
---
 bfd/ChangeLog      |  5 +++++
 bfd/elf32-visium.c | 13 ++++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4486ee8..75ed014 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak.
+	<R_VISIUM_PC16>: Use explicit range test to detect an overflow.
+
 2018-12-12  Alan Modra  <amodra@gmail.com>
 
 	Apply from master
diff --git a/bfd/elf32-visium.c b/bfd/elf32-visium.c
index e8f1c4c..2846140 100644
--- a/bfd/elf32-visium.c
+++ b/bfd/elf32-visium.c
@@ -312,7 +312,6 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry,
   bfd_vma relocation;
   bfd_byte *inplace_address;
   bfd_vma insn;
-  const bfd_vma signmask = 0xffff8000;
 
   /* This part is from bfd_elf_generic_reloc.
      If we're relocating, and this an external symbol, we don't want
@@ -351,19 +350,19 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry,
 
   if (reloc_entry->howto->pc_relative)
     {
-      relocation -= input_section->output_section->vma
-	+ input_section->output_offset;
+      relocation -= input_section->output_section->vma;
+      relocation -= input_section->output_offset;
       relocation -= reloc_entry->address;
     }
 
   switch (reloc_entry->howto->type)
     {
     case R_VISIUM_PC16:
-      relocation >>= 2;
-      if (ret == bfd_reloc_ok && (relocation & signmask) != 0
-	  && (relocation & signmask) != signmask)
+      if (ret == bfd_reloc_ok
+	  && ((bfd_signed_vma) relocation < -0x20000
+	      || (bfd_signed_vma) relocation > 0x1ffff))
 	ret = bfd_reloc_overflow;
-      relocation &= 0xffff;
+      relocation = (relocation >> 2) & 0xffff;
       break;
     case R_VISIUM_HI16:
     case R_VISIUM_HI16_PCREL:


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