From 49663d051c70e1366f9b94f586459a329e9b7053 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 14 Aug 2017 00:15:33 -0600 Subject: [PATCH] Use gdb::byte_vector in pascal_object_print_value This changes pascal_object_print_value to use a gdb::byte_vector. This removes a cleanup. This change also points out how the previous code had a possible use-after-free bug. ChangeLog 2017-09-09 Tom Tromey * p-valprint.c (pascal_object_print_value): Use gdb::byte_vector. --- gdb/ChangeLog | 4 ++++ gdb/p-valprint.c | 13 +++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2ccf4e68326..fd1f3609df1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2017-09-09 Tom Tromey + + * p-valprint.c (pascal_object_print_value): Use gdb::byte_vector. + 2017-09-09 Tom Tromey * stack.c (func_command): Use gdb::def_vector. diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index 1cd69cc2b11..d12b63638b9 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -38,6 +38,7 @@ #include "cp-abi.h" #include "cp-support.h" #include "objfiles.h" +#include "common/byte-vector.h" /* Decorations for Pascal. */ @@ -730,6 +731,7 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr, const gdb_byte *base_valaddr = NULL; LONGEST thisoffset; int skip = 0; + gdb::byte_vector buf; if (BASETYPE_VIA_VIRTUAL (type, i)) { @@ -769,20 +771,15 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr, if (boffset < 0 || boffset >= TYPE_LENGTH (type)) { - gdb_byte *buf; - struct cleanup *back_to; + buf.resize (TYPE_LENGTH (baseclass)); - buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass)); - back_to = make_cleanup (xfree, buf); - - base_valaddr = buf; - if (target_read_memory (address + boffset, buf, + base_valaddr = buf.data (); + if (target_read_memory (address + boffset, buf.data (), TYPE_LENGTH (baseclass)) != 0) skip = 1; address = address + boffset; thisoffset = 0; boffset = 0; - do_cleanups (back_to); } else base_valaddr = valaddr; -- 2.30.2