diff options
author | Alan Modra <amodra@gmail.com> | 2025-02-20 11:49:25 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2025-02-20 12:02:10 +1030 |
commit | 46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb (patch) | |
tree | 01fce0d5b9caf3110ba54d28f01c4b241a9d04e1 | |
parent | d08ab84d89035ed1ef489fc230756fa7779255a7 (diff) | |
download | binutils-46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb.zip binutils-46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb.tar.gz binutils-46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb.tar.bz2 |
PR 32721, internal error in tc-i386.c:parse_register
pr30117 showed one of the assertions added by 4d1bb7955a8b was too
strict. oss-fuzz also found the second assertion to be too strict,
with this testcase distilled from 7k of garbage source:
A=%eax%%!
Y=A
Z=A
or $6,Z
PR 32721
* config/tc-i386.c (parse_register): Move "know" into
condition. Simplify.
-rw-r--r-- | gas/config/tc-i386.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9cfc4df..53743fb 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -16838,10 +16838,9 @@ parse_register (const char *reg_string, char **end_op) { const expressionS *e = symbol_get_value_expression (symbolP); - if (e->X_op == O_register) + if (e->X_op == O_register + && (valueT) e->X_add_number < i386_regtab_size) { - know (e->X_add_number >= 0 - && (valueT) e->X_add_number < i386_regtab_size); r = i386_regtab + e->X_add_number; *end_op = (char *) reg_string + (input_line_pointer - buf); } |