aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2025-03-31 19:19:28 +1030
committerAlan Modra <amodra@gmail.com>2025-04-01 23:45:46 +1030
commit7bc46c997839cbcb02f987f4cbf776b7a3bcc6f8 (patch)
tree65d9a3307978d8be953a6b716483d29625bdfe03
parent8c78862afb2664f357fd0c89de5feb6f302afc0a (diff)
downloadbinutils-7bc46c997839cbcb02f987f4cbf776b7a3bcc6f8.zip
binutils-7bc46c997839cbcb02f987f4cbf776b7a3bcc6f8.tar.gz
binutils-7bc46c997839cbcb02f987f4cbf776b7a3bcc6f8.tar.bz2
ubsan: nds32 undefined shift
Avoid implementation defined behaviour right shift of negative values, and undefined behaviour left shift of negative values. While this change might give different results in the top bit of a bfd_vma (rightshift is 1), that doesn't matter as only the bottom 8 bits of the relocation are used. * elf32-nds32.c (nds32_elf_do_9_pcrel_reloc): Calculate relocation using a bfd_vma type.
-rw-r--r--bfd/elf32-nds32.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c
index e240c31..1aff60a 100644
--- a/bfd/elf32-nds32.c
+++ b/bfd/elf32-nds32.c
@@ -2692,7 +2692,7 @@ nds32_elf_do_9_pcrel_reloc (bfd * abfd,
bfd_vma symbol_value,
bfd_vma addend)
{
- bfd_signed_vma relocation;
+ bfd_vma relocation;
unsigned short x;
bfd_reloc_status_type status;
@@ -2708,7 +2708,7 @@ nds32_elf_do_9_pcrel_reloc (bfd * abfd,
before doing pcrel calculations. */
relocation -= (offset & -(bfd_vma) 2);
- if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
+ if (relocation + ACCURATE_8BIT_S1 >= 2 * ACCURATE_8BIT_S1)
status = bfd_reloc_overflow;
else
status = bfd_reloc_ok;