aboutsummaryrefslogtreecommitdiff
path: root/gdb/p-valprint.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-08-14 00:15:33 -0600
committerTom Tromey <tom@tromey.com>2017-09-09 14:10:49 -0600
commit49663d051c70e1366f9b94f586459a329e9b7053 (patch)
tree7bdf3526f3abcddcdadee7efe6c156df2af1376c /gdb/p-valprint.c
parent0b868b60c97b13566cefc8c8f1984225b0165eec (diff)
downloadgdb-49663d051c70e1366f9b94f586459a329e9b7053.zip
gdb-49663d051c70e1366f9b94f586459a329e9b7053.tar.gz
gdb-49663d051c70e1366f9b94f586459a329e9b7053.tar.bz2
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 <tom@tromey.com> * p-valprint.c (pascal_object_print_value): Use gdb::byte_vector.
Diffstat (limited to 'gdb/p-valprint.c')
-rw-r--r--gdb/p-valprint.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c
index 1cd69cc..d12b636 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;