Stop potential illegal memory access in the NS32K disassembler.
authorNick Clifton <nickc@redhat.com>
Mon, 28 Oct 2019 15:44:23 +0000 (15:44 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 28 Oct 2019 15:44:23 +0000 (15:44 +0000)
* ns32k-dis.c (bit_extract): Add sanitiy check of parameters.
(bit_extract_simple): Likewise.
(bit_copy): Likewise.
(pirnt_insn_ns32k): Ensure that uninitialised elements in the
index_offset array are not accessed.

opcodes/ChangeLog
opcodes/ns32k-dis.c

index 66df91109e2eca48eeb6207e415c6925501293c6..fe0f2402d7cf55186265a0c7f006c74654ee6718 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-28  Nick Clifton  <nickc@redhat.com>
+
+       * ns32k-dis.c (bit_extract): Add sanitiy check of parameters.
+       (bit_extract_simple): Likewise.
+       (bit_copy): Likewise.
+       (pirnt_insn_ns32k): Ensure that uninitialised elements in the
+       index_offset array are not accessed.
+
 2019-10-28  Nick Clifton  <nickc@redhat.com>
 
        * xgate-dis.c (print_insn): Fix decoding of the XGATE_OP_DYA
index 1fffbd8d1193989bafe71aacc884d4893972176d..22a9389ecff2dee701885b045e063c9c5b4fdb2a 100644 (file)
@@ -265,6 +265,8 @@ bit_extract (bfd_byte *buffer, int offset, int count)
   int result;
   int bit;
 
+  if (offset < 0 || count < 0)
+    return 0;
   buffer += offset >> 3;
   offset &= 7;
   bit = 1;
@@ -292,6 +294,8 @@ bit_extract_simple (bfd_byte *buffer, int offset, int count)
   int result;
   int bit;
 
+  if (offset < 0 || count < 0)
+    return 0;
   buffer += offset >> 3;
   offset &= 7;
   bit = 1;
@@ -313,6 +317,8 @@ bit_extract_simple (bfd_byte *buffer, int offset, int count)
 static void
 bit_copy (bfd_byte *buffer, int offset, int count, char *to)
 {
+  if (offset < 0 || count < 0)
+    return;
   for (; count > 8; count -= 8, to++, offset += 8)
     *to = bit_extract (buffer, offset, 8);
   *to = bit_extract (buffer, offset, count);
@@ -836,8 +842,10 @@ print_insn_ns32k (bfd_vma memaddr, disassemble_info *info)
                                    memaddr, arg_bufs[argnum],
                                    index_offset[whicharg]);
          d++;
-         whicharg++;
+         if (whicharg++ >= 1)
+           break;
        }
+
       for (argnum = 0; argnum <= maxarg; argnum++)
        {
          bfd_vma addr;