[binutils-gdb] PR 32721, internal error in tc-i386.c:parse_register

Alan Modra amodra@sourceware.org
Thu Feb 20 01:34:44 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb

commit 46b9f07dfe79d8c6857dbfada485a3b9c0e3ffdb
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Feb 20 11:49:25 2025 +1030

    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.

Diff:
---
 gas/config/tc-i386.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 9cfc4df1e10..53743fb4d7f 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);
 	    }


More information about the Binutils-cvs mailing list