summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-12-11 08:47:35 +1030
committerAlan Modra <amodra@gmail.com>2019-12-11 11:41:09 +1030
commit66152f16685fe63a5b2eb941c2d7057bbff5cfe5 (patch)
treeafbb6e058b5136d0cb05bf1adf57d9ad4e1fa32d
parent205c426a9bb387204a21165e2275e31c32248035 (diff)
downloadbinutils-gdb-66152f16685fe63a5b2eb941c2d7057bbff5cfe5.tar.gz
ubsan: tic4x: segv and signed shifts
* tic4x-dis.c (tic4x_print_register): Formatting. Don't segfault on NULL registertable entry. (tic4x_hash_opcode): Use unsigned arithmetic.
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/tic4x-dis.c16
2 files changed, 15 insertions, 7 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index a8e1d30a9d4..3ae93c16414 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,11 @@
2019-12-11 Alan Modra <amodra@gmail.com>
+ * tic4x-dis.c (tic4x_print_register): Formatting. Don't segfault
+ on NULL registertable entry.
+ (tic4x_hash_opcode): Use unsigned arithmetic.
+
+2019-12-11 Alan Modra <amodra@gmail.com>
+
* s12z-opc.c (z_decode_signed_value): Avoid signed overflow.
2019-12-11 Alan Modra <amodra@gmail.com>
diff --git a/opcodes/tic4x-dis.c b/opcodes/tic4x-dis.c
index de3d5366d9e..d9f95c94106 100644
--- a/opcodes/tic4x-dis.c
+++ b/opcodes/tic4x-dis.c
@@ -137,17 +137,19 @@ tic4x_print_register (struct disassemble_info *info, unsigned long regno)
{
registertable = xmalloc (sizeof (tic4x_register_t *) * REG_TABLE_SIZE);
for (i = 0; i < tic3x_num_registers; i++)
- registertable[tic3x_registers[i].regno] = (tic4x_register_t *) (tic3x_registers + i);
+ registertable[tic3x_registers[i].regno]
+ = (tic4x_register_t *) (tic3x_registers + i);
if (IS_CPU_TIC4X (tic4x_version))
{
/* Add C4x additional registers, overwriting
any C3x registers if necessary. */
for (i = 0; i < tic4x_num_registers; i++)
- registertable[tic4x_registers[i].regno] =
- (tic4x_register_t *)(tic4x_registers + i);
+ registertable[tic4x_registers[i].regno]
+ = (tic4x_register_t *)(tic4x_registers + i);
}
}
- if ((int) regno > (IS_CPU_TIC4X (tic4x_version) ? TIC4X_REG_MAX : TIC3X_REG_MAX))
+ if (regno > (IS_CPU_TIC4X (tic4x_version) ? TIC4X_REG_MAX : TIC3X_REG_MAX)
+ || registertable[regno] == NULL)
return 0;
if (info != NULL)
(*info->fprintf_func) (info->stream, "%s", registertable[regno]->name);
@@ -639,9 +641,9 @@ tic4x_hash_opcode (tic4x_inst_t **optable,
const tic4x_inst_t *inst,
const unsigned long tic4x_oplevel)
{
- int j;
- int opcode = inst->opcode >> (32 - TIC4X_HASH_SIZE);
- int opmask = inst->opmask >> (32 - TIC4X_HASH_SIZE);
+ unsigned int j;
+ unsigned int opcode = inst->opcode >> (32 - TIC4X_HASH_SIZE);
+ unsigned int opmask = inst->opmask >> (32 - TIC4X_HASH_SIZE);
/* Use a TIC4X_HASH_SIZE bit index as a hash index. We should
have unique entries so there's no point having a linked list