segfault at i386-dis.c:9815
authorAlan Modra <amodra@gmail.com>
Fri, 17 Mar 2023 10:34:52 +0000 (21:04 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 19 Mar 2023 13:05:18 +0000 (23:35 +1030)
* i386-dis.c (print_insn): Access "ins" and "priv" via volatile
pointers after second sigsetjmp return.

opcodes/i386-dis.c

index a414e8c9b1ef8aa2334406120d33993c61b001c7..9684dcda746de68b2da99207cd4add8daae15b8d 100644 (file)
@@ -9808,12 +9808,17 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
       /* Getting here means we tried for data but didn't get it.  That
         means we have an incomplete instruction of some sort.  Just
         print the first byte as a prefix or a .byte pseudo-op.  */
-      if (ins.codep > priv.the_buffer)
+      volatile struct dis_private *ppriv = &priv;
+      volatile instr_info *pins = &ins;
+      if (pins->codep > ppriv->the_buffer)
        {
          const char *name = NULL;
 
-         if (ins.prefixes || ins.fwait_prefix >= 0 || (ins.rex & REX_OPCODE))
-           name = prefix_name (&ins, priv.the_buffer[0], priv.orig_sizeflag);
+         if (pins->prefixes
+             || pins->fwait_prefix >= 0
+             || (pins->rex & REX_OPCODE))
+           name = prefix_name (&ins, ppriv->the_buffer[0],
+                               ppriv->orig_sizeflag);
          if (name != NULL)
            i386_dis_printf (&ins, dis_style_mnemonic, "%s", name);
          else
@@ -9822,7 +9827,7 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
              i386_dis_printf (&ins, dis_style_assembler_directive,
                               ".byte ");
              i386_dis_printf (&ins, dis_style_immediate, "0x%x",
-                              (unsigned int) priv.the_buffer[0]);
+                              (unsigned int) ppriv->the_buffer[0]);
            }
 
          return 1;