mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
gas/arc: Fix array overrun when checking opcode array
The opcode array iterator mechanism can, in some situations, result in reading memory outside of the opcode array. When using the iterator-next mechanism to find the next possible arc_opcode, if we find an opcode where the name field is NULL, or the name does not match, then the cached opcode pointer is not set to NULL. The result is that another call to iterator-next will again increment the opcode pointer (which might now point outside the opcode array) and attempt to access the name field of this undefined opcode. Fixed in this commit by clearing the cached opcode pointer. I've added a test case, which currently shows the bug, however, this will only expose this bug while the opcode used (dsp_fp_cmp) is the last opcode in the table. gas/ChangeLog: * config/tc-arc.c (arc_opcode_hash_entry_iterator_next): Set cached opcode to NULL when we reach a non-matching opcode. * testsuite/gas/arc/asm-errors-2.d: New file. * testsuite/gas/arc/asm-errors-2.err: New file. * testsuite/gas/arc/asm-errors-2.s: New file.
This commit is contained in:
@ -1,3 +1,11 @@
|
||||
2016-05-18 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* config/tc-arc.c (arc_opcode_hash_entry_iterator_next): Set
|
||||
cached opcode to NULL when we reach a non-matching opcode.
|
||||
* testsuite/gas/arc/asm-errors-2.d: New file.
|
||||
* testsuite/gas/arc/asm-errors-2.err: New file.
|
||||
* testsuite/gas/arc/asm-errors-2.s: New file.
|
||||
|
||||
2016-05-18 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* config/tc-arc.c (tokenize_arguments): Add checks for array
|
||||
|
@ -674,8 +674,8 @@ arc_opcode_hash_entry_iterator_next (const struct arc_opcode_hash_entry *entry,
|
||||
const char *old_name = iter->opcode->name;
|
||||
|
||||
iter->opcode++;
|
||||
if (iter->opcode->name
|
||||
&& (strcmp (old_name, iter->opcode->name) != 0))
|
||||
if (iter->opcode->name == NULL
|
||||
|| strcmp (old_name, iter->opcode->name) != 0)
|
||||
{
|
||||
iter->index++;
|
||||
if (iter->index == entry->count)
|
||||
|
2
gas/testsuite/gas/arc/asm-errors-2.d
Normal file
2
gas/testsuite/gas/arc/asm-errors-2.d
Normal file
@ -0,0 +1,2 @@
|
||||
#as: -mcpu=arcem
|
||||
#error-output: asm-errors-2.err
|
2
gas/testsuite/gas/arc/asm-errors-2.err
Normal file
2
gas/testsuite/gas/arc/asm-errors-2.err
Normal file
@ -0,0 +1,2 @@
|
||||
[^:]*: Assembler messages:
|
||||
[^:]*:2: Error: inappropriate arguments for opcode 'dsp_fp_cmp'
|
2
gas/testsuite/gas/arc/asm-errors-2.s
Normal file
2
gas/testsuite/gas/arc/asm-errors-2.s
Normal file
@ -0,0 +1,2 @@
|
||||
.text
|
||||
dsp_fp_cmp r0
|
Reference in New Issue
Block a user