diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8942e25127..9e1e67db7a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-01-18 Alan Hayward + + * remote.c (struct cached_reg): Change data into a pointer. + * (stop_reply_dtr): Free data pointers before deleting vector. + (process_stop_reply): Likewise. + (remote_parse_stop_reply): Allocate space for data + 2017-01-18 Alan Hayward * amd64-tdep.c (amd64_pseudo_register_read_value): remove diff --git a/gdb/remote.c b/gdb/remote.c index b81bb2f430..c4cec910c4 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -6311,7 +6311,7 @@ remote_console_output (char *msg) typedef struct cached_reg { int num; - gdb_byte data[MAX_REGISTER_SIZE]; + gdb_byte *data; } cached_reg_t; DEF_VEC_O(cached_reg_t); @@ -6407,6 +6407,13 @@ static void stop_reply_dtr (struct notif_event *event) { struct stop_reply *r = (struct stop_reply *) event; + cached_reg_t *reg; + int ix; + + for (ix = 0; + VEC_iterate (cached_reg_t, r->regcache, ix, reg); + ix++) + xfree (reg->data); VEC_free (cached_reg_t, r->regcache); } @@ -6979,6 +6986,7 @@ Packet: '%s'\n"), { struct packet_reg *reg = packet_reg_from_pnum (rsa, pnum); cached_reg_t cached_reg; + struct gdbarch *gdbarch = target_gdbarch (); if (reg == NULL) error (_("Remote sent bad register number %s: %s\n\ @@ -6986,14 +6994,14 @@ Packet: '%s'\n"), hex_string (pnum), p, buf); cached_reg.num = reg->regnum; + cached_reg.data = (gdb_byte *) + xmalloc (register_size (gdbarch, reg->regnum)); p = p1 + 1; fieldsize = hex2bin (p, cached_reg.data, - register_size (target_gdbarch (), - reg->regnum)); + register_size (gdbarch, reg->regnum)); p += 2 * fieldsize; - if (fieldsize < register_size (target_gdbarch (), - reg->regnum)) + if (fieldsize < register_size (gdbarch, reg->regnum)) warning (_("Remote reply is too short: %s"), buf); VEC_safe_push (cached_reg_t, event->regcache, &cached_reg); @@ -7214,9 +7222,13 @@ process_stop_reply (struct stop_reply *stop_reply, int ix; for (ix = 0; - VEC_iterate(cached_reg_t, stop_reply->regcache, ix, reg); + VEC_iterate (cached_reg_t, stop_reply->regcache, ix, reg); ix++) + { regcache_raw_supply (regcache, reg->num, reg->data); + xfree (reg->data); + } + VEC_free (cached_reg_t, stop_reply->regcache); }