Prevent a left shift by a negative value when disassembling IA64 binaries.
authorNick Clifton <nickc@redhat.com>
Tue, 29 Oct 2019 10:01:27 +0000 (10:01 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 29 Oct 2019 10:01:27 +0000 (10:01 +0000)
* ia64-opc.c (locate_opcode_ent): Prevent a negative shift when
locating the bit to be tested.

opcodes/ChangeLog
opcodes/ia64-opc.c

index d83b5bab853ee25c01267d7b9eea3defe4febee9..d596729a11637f696e9b5fa8c869f6eb57ad8b54 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-29  Nick Clifton  <nickc@redhat.com>
+
+       * ia64-opc.c (locate_opcode_ent): Prevent a negative shift when
+       locating the bit to be tested.
+
 2019-10-29  Nick Clifton  <nickc@redhat.com>
 
        * s12z-dis.c (opr_emit_disassembly): Check for illegal register
index 5aa1198ec533f877f12fb9253ed8b99f4ebe3dda..ba60f8a78295d2bf9ff7b839586bad59f376bcd4 100644 (file)
@@ -372,13 +372,16 @@ locate_opcode_ent (ia64_insn opcode, enum ia64_insn_type type)
 
       bitpos[currstatenum] = currbitnum;
 
-      /* Skip opval[0] bits in the instruction. */
+      /* Skip opval[0] bits in the instruction.  */
       if (op & 0x40)
        {
          currbitnum -= opval[0];
        }
 
-      /* The value of the current bit being tested. */
+      if (currbitnum < 0)
+       currbitnum = 0;
+
+      /* The value of the current bit being tested.  */
       currbit = opcode & (((ia64_insn) 1) << currbitnum) ? 1 : 0;
       next_op = -1;
 
@@ -463,7 +466,7 @@ locate_opcode_ent (ia64_insn opcode, enum ia64_insn_type type)
 
          if (next_op > 65535)
            {
-             abort ();
+             return -1;
            }
 
          /* Run through the list of opcodes to check, trying to find