X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=opcodes%2Fns32k-dis.c;h=e43fff712abc858d9e4da7f5e419882673abd52a;hb=7cac64af7bc6a7f7a86f90a1465f7c3d2b6f07e8;hp=0794163f0f3d335e997807d2a3233600601a9890;hpb=88c1242dc0a1e1ab582a65ea8bd05eb5f244c59b;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ns32k-dis.c b/opcodes/ns32k-dis.c index 0794163f0f..e43fff712a 100644 --- a/opcodes/ns32k-dis.c +++ b/opcodes/ns32k-dis.c @@ -1,5 +1,5 @@ /* Print National Semiconductor 32000 instructions. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of the GNU opcodes library. @@ -262,9 +262,11 @@ list_search (int reg_value, const struct ns32k_option *optionP, char *result) static int bit_extract (bfd_byte *buffer, int offset, int count) { - int result; - int bit; + unsigned int result; + unsigned int bit; + if (offset < 0 || count < 0) + return 0; buffer += offset >> 3; offset &= 7; bit = 1; @@ -289,9 +291,11 @@ bit_extract (bfd_byte *buffer, int offset, int count) static int bit_extract_simple (bfd_byte *buffer, int offset, int count) { - int result; - int bit; + unsigned int result; + unsigned int bit; + if (offset < 0 || count < 0) + return 0; buffer += offset >> 3; offset &= 7; bit = 1; @@ -313,18 +317,18 @@ 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); } static int -sign_extend (int value, int bits) +sign_extend (unsigned int value, unsigned int bits) { - value = value & ((1 << bits) - 1); - return (value & (1 << (bits - 1)) - ? value | (~((1 << bits) - 1)) - : value); + unsigned int sign = 1u << (bits - 1); + return ((value & (sign + sign - 1)) ^ sign) - sign; } static void @@ -836,8 +840,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;