gdb/record-full: Use xmalloc instead of alloca for temporary memory storage.
authorMarcin Kościelnicki <koriakin@0x04.net>
Mon, 2 Nov 2015 01:12:58 +0000 (02:12 +0100)
committerMarcin Kościelnicki <koriakin@0x04.net>
Wed, 4 Nov 2015 14:26:59 +0000 (15:26 +0100)
On the newly added s390 target, it's possible for a single instruction
to write practically unbounded amount of memory (eg. MVCLE).  This caused
a stack overflow when alloca was used.

gdb/ChangeLog:

* record-full.c (record_full_exec_insn): Use xmalloc for temporary
memory storage.

gdb/ChangeLog
gdb/record-full.c

index a95fe4c14b3f484483972be3afe684382dbfc89e..d286821bb553c1c80017b23a273f881673511dac 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-04  Marcin Kościelnicki  <koriakin@0x04.net>
+
+       * record-full.c (record_full_exec_insn): Use xmalloc for temporary
+       memory storage.
+
 2015-11-04  Markus Metzger  <markus.t.metzger@intel.com>
 
        * record.c (get_insn_history_modifiers): Set DISASSEMBLY_SOURCE
index 595e357a3b5c8af5cc487d41b7e7500d6ceb3292..03b3d41402ee51c9b44bc3a129274488e3bf683b 100644 (file)
@@ -726,7 +726,8 @@ record_full_exec_insn (struct regcache *regcache,
        /* Nothing to do if the entry is flagged not_accessible.  */
         if (!entry->u.mem.mem_entry_not_accessible)
           {
-            gdb_byte *mem = (gdb_byte *) alloca (entry->u.mem.len);
+            gdb_byte *mem = (gdb_byte *) xmalloc (entry->u.mem.len);
+            struct cleanup *cleanup = make_cleanup (xfree, mem);
 
             if (record_debug > 1)
               fprintf_unfiltered (gdb_stdlog,
@@ -771,6 +772,8 @@ record_full_exec_insn (struct regcache *regcache,
                      record_full_stop_reason = TARGET_STOPPED_BY_WATCHPOINT;
                  }
               }
+
+           do_cleanups (cleanup);
           }
       }
       break;