asan: Buffer overflow in evax_bfd_print_dst
[binutils-gdb.git] / bfd / xtensa-isa.c
index 8da75bea8109718e9d41cfcc8596d227cf9cb594..63efbd4994888fc00ebd61ad6ecac5a0ece9dd7e 100644 (file)
@@ -1,5 +1,5 @@
 /* Configurable Xtensa ISA support.
-   Copyright (C) 2003-2017 Free Software Foundation, Inc.
+   Copyright (C) 2003-2022 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -24,8 +24,8 @@
 #include "xtensa-isa.h"
 #include "xtensa-isa-internal.h"
 
-xtensa_isa_status xtisa_errno;
-char xtisa_error_msg[1024];
+static xtensa_isa_status xtisa_errno;
+static char xtisa_error_msg[1024];
 
 
 xtensa_isa_status
@@ -223,11 +223,10 @@ xtensa_insnbuf_from_chars (xtensa_isa isa,
       int word_inx = byte_to_word_index (i);
       int bit_inx = byte_to_bit_index (i);
 
-      insn[word_inx] |= (*cp & 0xff) << bit_inx;
+      insn[word_inx] |= (unsigned) (*cp & 0xff) << bit_inx;
     }
 }
 
-
 \f
 /* ISA information.  */
 
@@ -292,7 +291,8 @@ xtensa_isa_init (xtensa_isa_status *errno_p, char **error_msg_p)
       xtensa_sysreg_internal *sreg = &isa->sysregs[n];
       is_user = sreg->is_user;
 
-      isa->sysreg_table[is_user][sreg->number] = n;
+      if (sreg->number >= 0)
+       isa->sysreg_table[is_user][sreg->number] = n;
     }
 
   /* Set up the interface lookup table.  */
@@ -339,43 +339,26 @@ xtensa_isa_free (xtensa_isa isa)
      the memory allocated by xtensa_isa_init and restore the xtensa_isa
      structure to its initial state.  */
 
-  if (intisa->opname_lookup_table)
-    {
-      free (intisa->opname_lookup_table);
-      intisa->opname_lookup_table = 0;
-    }
+  free (intisa->opname_lookup_table);
+  intisa->opname_lookup_table = 0;
 
-  if (intisa->state_lookup_table)
-    {
-      free (intisa->state_lookup_table);
-      intisa->state_lookup_table = 0;
-    }
+  free (intisa->state_lookup_table);
+  intisa->state_lookup_table = 0;
+
+  free (intisa->sysreg_lookup_table);
+  intisa->sysreg_lookup_table = 0;
 
-  if (intisa->sysreg_lookup_table)
-    {
-      free (intisa->sysreg_lookup_table);
-      intisa->sysreg_lookup_table = 0;
-    }
   for (n = 0; n < 2; n++)
     {
-      if (intisa->sysreg_table[n])
-       {
-         free (intisa->sysreg_table[n]);
-         intisa->sysreg_table[n] = 0;
-       }
+      free (intisa->sysreg_table[n]);
+      intisa->sysreg_table[n] = 0;
     }
 
-  if (intisa->interface_lookup_table)
-    {
-      free (intisa->interface_lookup_table);
-      intisa->interface_lookup_table = 0;
-    }
+  free (intisa->interface_lookup_table);
+  intisa->interface_lookup_table = 0;
 
-  if (intisa->funcUnit_lookup_table)
-    {
-      free (intisa->funcUnit_lookup_table);
-      intisa->funcUnit_lookup_table = 0;
-    }
+  free (intisa->funcUnit_lookup_table);
+  intisa->funcUnit_lookup_table = 0;
 }