aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-08-31 09:50:49 +0930
committerAlan Modra <amodra@gmail.com>2020-08-31 20:28:09 +0930
commitf2173852cff1459b04db4d84debbbf8961d6e23e (patch)
tree5d58da9a3ee578fd79f9a17757ba9d5dcfe6b66a /bfd
parent880fc278cadb4c057bc85ef27b199cac12f8c095 (diff)
downloadbinutils-f2173852cff1459b04db4d84debbbf8961d6e23e.zip
binutils-f2173852cff1459b04db4d84debbbf8961d6e23e.tar.gz
binutils-f2173852cff1459b04db4d84debbbf8961d6e23e.tar.bz2
PR26445 UBSAN: elf32-csky.c:4115 left shift of negative value
PR 26445 * elf32-csky.c (csky_relocate_contents): Make relocation a bfd_vma, and similarly for variables dealing with overflow.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-csky.c24
2 files changed, 18 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7388c4d..04f6f4c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2020-08-31 Alan Modra <amodra@gmail.com>
+ PR 26445
+ * elf32-csky.c (csky_relocate_contents): Make relocation a bfd_vma,
+ and similarly for variables dealing with overflow.
+
+2020-08-31 Alan Modra <amodra@gmail.com>
+
PR 26442
* elf32-crx.c (crx_elf_final_link_relocate): Calculate reloc_bits
without undefined behaviour. Tidy excess casts.
diff --git a/bfd/elf32-csky.c b/bfd/elf32-csky.c
index 80155cd..395e6ff 100644
--- a/bfd/elf32-csky.c
+++ b/bfd/elf32-csky.c
@@ -3918,7 +3918,7 @@ elf32_csky_setup_section_lists (bfd *output_bfd,
static bfd_reloc_status_type
csky_relocate_contents (reloc_howto_type *howto,
bfd *input_bfd,
- long relocation,
+ bfd_vma relocation,
bfd_byte *location)
{
int size;
@@ -3961,7 +3961,7 @@ csky_relocate_contents (reloc_howto_type *howto,
if (R_CKCORE_DOFFSET_LO16 == howto->type)
{
- if ((signed) relocation < 0)
+ if ((bfd_signed_vma) relocation < 0)
{
x |= CSKY_INSN_ADDI_TO_SUBI;
relocation = -relocation;
@@ -3972,7 +3972,7 @@ csky_relocate_contents (reloc_howto_type *howto,
}
else if (R_CKCORE_TOFFSET_LO16 == howto->type)
{
- if ((signed) relocation < 0)
+ if ((bfd_signed_vma) relocation < 0)
{
x |= CSKY_INSN_ADDI_TO_SUBI;
relocation = -relocation;
@@ -3993,13 +3993,13 @@ csky_relocate_contents (reloc_howto_type *howto,
flag = bfd_reloc_ok;
if (howto->complain_on_overflow != complain_overflow_dont)
{
- int addrmask;
- int fieldmask;
- int signmask;
- int ss;
- int a;
- int b;
- int sum;
+ bfd_vma addrmask;
+ bfd_vma fieldmask;
+ bfd_vma signmask;
+ bfd_vma ss;
+ bfd_vma a;
+ bfd_vma b;
+ bfd_vma sum;
/* Get the values to be added together. For signed and unsigned
relocations, we assume that all values should be truncated to
the size of an address. For bitfields, all the bits matter.
@@ -4085,7 +4085,7 @@ csky_relocate_contents (reloc_howto_type *howto,
}
/* Put RELOCATION in the right bits. */
- relocation >>= (bfd_vma) rightshift;
+ relocation >>= rightshift;
if ((howto->type == R_CKCORE_DOFFSET_LO16
|| howto->type == R_CKCORE_TOFFSET_LO16)
@@ -4112,7 +4112,7 @@ csky_relocate_contents (reloc_howto_type *howto,
csky_put_insn_32 (input_bfd, CSKY_INSN_JSR_R26, location + 4);
}
- relocation <<= (bfd_vma) bitpos;
+ relocation <<= bitpos;
/* Add RELOCATION to the right bits of X. */
x = ((x & ~howto->dst_mask)
| (((x & howto->src_mask) + relocation) & howto->dst_mask));