summaryrefslogtreecommitdiff
path: root/opcodes/pj-dis.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-09-03 08:23:49 +0930
committerAlan Modra <amodra@gmail.com>2021-09-03 11:45:58 +0930
commit2ea9d33a127c09d9c4df0337981e48fb4b7a236f (patch)
treec34f93ba699aebf807c7f2b87141175f4009fe05 /opcodes/pj-dis.c
parentf2cfdb748606b3e634050b8f7030e5e7783a4232 (diff)
downloadbinutils-gdb-2ea9d33a127c09d9c4df0337981e48fb4b7a236f.tar.gz
pj: asan: out of bounds, ubsan: left shift of negative
* pj-dis.c: Include libiberty.h. (print_insn_pj): Don't index op->arg past array bound. Don't left shift negative int.
Diffstat (limited to 'opcodes/pj-dis.c')
-rw-r--r--opcodes/pj-dis.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/opcodes/pj-dis.c b/opcodes/pj-dis.c
index a67ea389566..f0708a0522e 100644
--- a/opcodes/pj-dis.c
+++ b/opcodes/pj-dis.c
@@ -21,6 +21,7 @@
#include "sysdep.h"
#include <stdio.h>
+#include "libiberty.h"
#include "opcode/pj.h"
#include "disassemble.h"
@@ -65,7 +66,7 @@ print_insn_pj (bfd_vma addr, struct disassemble_info *info)
char *sep = "\t";
int insn_start = addr;
const pj_opc_info_t *op = &pj_opc_info[opcode];
- int a;
+ unsigned int a;
addr++;
fprintf_fn (stream, "%s", op->u.name);
@@ -145,7 +146,7 @@ print_insn_pj (bfd_vma addr, struct disassemble_info *info)
return addr - insn_start;
}
- for (a = 0; op->arg[a]; a++)
+ for (a = 0; a < ARRAY_SIZE (op->arg) && op->arg[a]; a++)
{
unsigned char data[4];
int val = 0;
@@ -158,7 +159,7 @@ print_insn_pj (bfd_vma addr, struct disassemble_info *info)
val = (UNS (op->arg[0]) || ((data[0] & 0x80) == 0)) ? 0 : -1;
for (i = 0; i < size; i++)
- val = (val << 8) | (data[i] & 0xff);
+ val = ((unsigned) val << 8) | (data[i] & 0xff);
fprintf_fn (stream, "%s", sep);
if (PCREL (op->arg[a]))