More signed overflow fixes
[deliverable/binutils-gdb.git] / opcodes / tic30-dis.c
index 23dcbfa0ac483238d3e999362639fa959abb0c35..a695159d77c5142dfa68cde83c923c21f1677fa1 100644 (file)
@@ -1,5 +1,5 @@
 /* Disassembly routines for TMS320C30 architecture
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
+   Copyright (C) 1998-2019 Free Software Foundation, Inc.
    Contributed by Steven Haworth (steve@pm.cse.rmit.edu.au)
 
    This file is part of the GNU opcodes library.
@@ -22,7 +22,7 @@
 #include "sysdep.h"
 #include <errno.h>
 #include <math.h>
-#include "dis-asm.h"
+#include "disassemble.h"
 #include "opcode/tic30.h"
 
 #define NORMAL_INSN   1
@@ -188,6 +188,8 @@ get_tic30_instruction (unsigned long insn_word, struct instruction *insn)
   return 1;
 }
 
+#define OPERAND_BUFFER_LEN 15
+
 static int
 get_register_operand (unsigned char fragment, char *buffer)
 {
@@ -199,7 +201,8 @@ get_register_operand (unsigned char fragment, char *buffer)
     {
       if ((fragment & 0x1F) == current_reg->opcode)
        {
-         strcpy (buffer, current_reg->name);
+         strncpy (buffer, current_reg->name, OPERAND_BUFFER_LEN);
+         buffer[OPERAND_BUFFER_LEN - 1] = 0;
          return 1;
        }
     }
@@ -250,16 +253,25 @@ get_indirect_operand (unsigned short fragment,
                int bufcnt;
 
                len = strlen (current_ind->syntax);
+
                for (i = 0, bufcnt = 0; i < len; i++, bufcnt++)
                  {
                    buffer[bufcnt] = current_ind->syntax[i];
-                   if (buffer[bufcnt - 1] == 'a' && buffer[bufcnt] == 'r')
+
+                   if (bufcnt > 0
+                       && bufcnt < OPERAND_BUFFER_LEN - 1
+                       && buffer[bufcnt - 1] == 'a'
+                       && buffer[bufcnt] == 'r')
                      buffer[++bufcnt] = arnum + '0';
-                   if (buffer[bufcnt] == '('
+                   
+                   if (bufcnt < OPERAND_BUFFER_LEN - 1
+                       && buffer[bufcnt] == '('
                        && current_ind->displacement == DISP_REQUIRED)
                      {
-                       sprintf (&buffer[bufcnt + 1], "%u", disp);
-                       bufcnt += strlen (&buffer[bufcnt + 1]);
+                       snprintf (buffer + (bufcnt + 1),
+                                OPERAND_BUFFER_LEN - (bufcnt + 1),
+                                "%u", disp);
+                       bufcnt += strlen (buffer + (bufcnt + 1));
                      }
                  }
                buffer[bufcnt + 1] = '\0';
@@ -340,7 +352,7 @@ print_two_operand (disassemble_info *info,
                   struct instruction *insn)
 {
   char name[12];
-  char operand[2][13] =
+  char operand[2][OPERAND_BUFFER_LEN] =
   {
     {0},
     {0}
@@ -427,7 +439,7 @@ print_three_operand (disassemble_info *info,
                     unsigned long insn_word,
                     struct instruction *insn)
 {
-  char operand[3][13] =
+  char operand[3][OPERAND_BUFFER_LEN] =
   {
     {0},
     {0},
@@ -473,7 +485,7 @@ print_par_insn (disassemble_info *info,
 {
   size_t i, len;
   char *name1, *name2;
-  char operand[2][3][13] =
+  char operand[2][3][OPERAND_BUFFER_LEN] =
   {
     {
       {0},
@@ -595,7 +607,7 @@ print_branch (disassemble_info *info,
              unsigned long insn_word,
              struct instruction *insn)
 {
-  char operand[2][13] =
+  char operand[2][OPERAND_BUFFER_LEN] =
   {
     {0},
     {0}
@@ -669,9 +681,9 @@ print_branch (disassemble_info *info,
       if (address == 0)
        info->fprintf_func (info->stream, " <%s>", sym->name);
       else
-       info->fprintf_func (info->stream, " <%s %c %d>", sym->name,
+       info->fprintf_func (info->stream, " <%s %c %lu>", sym->name,
                            ((short) address < 0) ? '-' : '+',
-                           abs (address));
+                           address);
     }
   return 1;
 }
@@ -684,8 +696,10 @@ print_insn_tic30 (bfd_vma pc, disassemble_info *info)
   bfd_vma bufaddr = pc - info->buffer_vma;
 
   /* Obtain the current instruction word from the buffer.  */
-  insn_word = (*(info->buffer + bufaddr) << 24) | (*(info->buffer + bufaddr + 1) << 16) |
-    (*(info->buffer + bufaddr + 2) << 8) | *(info->buffer + bufaddr + 3);
+  insn_word = (((unsigned) *(info->buffer + bufaddr) << 24)
+              | (*(info->buffer + bufaddr + 1) << 16)
+              | (*(info->buffer + bufaddr + 2) << 8)
+              | *(info->buffer + bufaddr + 3));
   _pc = pc / 4;
   /* Get the instruction refered to by the current instruction word
      and print it out based on its type.  */
This page took 0.024677 seconds and 4 git commands to generate.