diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-11 08:47:35 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-11 11:41:09 +1030 |
commit | 66152f16685fe63a5b2eb941c2d7057bbff5cfe5 (patch) | |
tree | afbb6e058b5136d0cb05bf1adf57d9ad4e1fa32d /opcodes/tic4x-dis.c | |
parent | 205c426a9bb387204a21165e2275e31c32248035 (diff) | |
download | binutils-66152f16685fe63a5b2eb941c2d7057bbff5cfe5.zip binutils-66152f16685fe63a5b2eb941c2d7057bbff5cfe5.tar.gz binutils-66152f16685fe63a5b2eb941c2d7057bbff5cfe5.tar.bz2 |
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.
Diffstat (limited to 'opcodes/tic4x-dis.c')
-rw-r--r-- | opcodes/tic4x-dis.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/opcodes/tic4x-dis.c b/opcodes/tic4x-dis.c index de3d536..d9f95c9 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 |