gas/arc: Add guard against operand array overflow.

Currently supplying an input file with too many operands to an
instruction will cause the assembler to overflow and array and trigger
undefined behaviour.

This change checks that we don't access outside the limits of the
operand array.

gas/ChangeLog:

	* config/tc-arc.c (tokenize_arguments): Add checks for array
	overflow.
	* testsuite/gas/arc/asm-errors.s: Addition test line added.
	* testsuite/gas/arc/asm-errors.err: Update expected results.
This commit is contained in:
Andrew Burgess 2016-05-03 13:43:44 +01:00
parent 45f4ed92d1
commit 3b889a7878
4 changed files with 17 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2016-05-18 Andrew Burgess <andrew.burgess@embecosm.com>
* config/tc-arc.c (tokenize_arguments): Add checks for array
overflow.
* testsuite/gas/arc/asm-errors.s: Addition test line added.
* testsuite/gas/arc/asm-errors.err: Update expected results.
2016-05-18 Trevor Saunders <tbsaunde+binutils@tbsaunde.org>
* config/tc-rx.c (struct cpu_type): Change the type of a field from

View File

@ -1039,7 +1039,7 @@ tokenize_arguments (char *str,
case ']':
++input_line_pointer;
--brk_lvl;
if (!saw_arg)
if (!saw_arg || num_args == ntok)
goto err;
tok->X_op = O_bracket;
++tok;
@ -1049,7 +1049,7 @@ tokenize_arguments (char *str,
case '{':
case '[':
input_line_pointer++;
if (brk_lvl)
if (brk_lvl || num_args == ntok)
goto err;
++brk_lvl;
tok->X_op = O_bracket;
@ -1060,7 +1060,7 @@ tokenize_arguments (char *str,
case '@':
/* We have labels, function names and relocations, all
starting with @ symbol. Sort them out. */
if (saw_arg && !saw_comma)
if ((saw_arg && !saw_comma) || num_args == ntok)
goto err;
/* Parse @label. */
@ -1165,7 +1165,7 @@ tokenize_arguments (char *str,
/* Fall through. */
default:
if (saw_arg && !saw_comma)
if ((saw_arg && !saw_comma) || num_args == ntok)
goto err;
tok->X_op = O_absent;
@ -1181,7 +1181,9 @@ tokenize_arguments (char *str,
normalsymbol:
debug_exp (tok);
if (tok->X_op == O_illegal || tok->X_op == O_absent)
if (tok->X_op == O_illegal
|| tok->X_op == O_absent
|| num_args == ntok)
goto err;
saw_comma = FALSE;

View File

@ -2,3 +2,5 @@
[^:]*:2: Error: inappropriate arguments for opcode 'adc'
[^:]*:3: Error: inappropriate arguments for opcode 'adc'
[^:]*:4: Error: inappropriate arguments for opcode 'adc'
[^:]*:5: Error: extra comma
[^:]*:5: Error: syntax error

View File

@ -2,3 +2,4 @@
adc.al.ra r0,r0,r2
adc.eq.eq r0,r0,r2
adc.n.eq r0,r0,r2
add r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0,r0