[binutils-gdb] aarch64 disassembler infinite loop

Alan Modra amodra@sourceware.org
Wed Dec 11 01:13:00 GMT 2019


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

commit 9d48687b41f17ccbd7c61dd76b96147f28916951
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Dec 10 19:04:37 2019 +1030

    aarch64 disassembler infinite loop
    
    Assembling this to an object and trying to disassemble results in
    objdump -d looping forever.
    
     .inst 0x45205120
    
    	PR 25270
    	* aarch64-dis.c (aarch64_decode_variant_using_iclass): Return
    	false when field is zero for sve_size_tsz_bhs.

Diff:
---
 opcodes/ChangeLog     | 6 ++++++
 opcodes/aarch64-dis.c | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index de76acc..3460b3e 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,11 @@
 2019-12-11  Alan Modra  <amodra@gmail.com>
 
+	PR 25270
+	* aarch64-dis.c (aarch64_decode_variant_using_iclass): Return
+	false when field is zero for sve_size_tsz_bhs.
+
+2019-12-11  Alan Modra  <amodra@gmail.com>
+
 	* epiphany-ibld.c: Regenerate.
 
 2019-12-10  Alan Modra  <amodra@gmail.com>
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index 9300569..8b32097 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -2843,6 +2843,8 @@ aarch64_decode_variant_using_iclass (aarch64_inst *inst)
 
     case sve_size_tsz_bhs:
       i = extract_fields (inst->value, 0, 2, FLD_SVE_sz, FLD_SVE_tszl_19);
+      if (i == 0)
+	return FALSE;
       while (i != 1)
 	{
 	  if (i & 1)



More information about the Binutils-cvs mailing list