diff options
author | Tom Tromey <tom@tromey.com> | 2017-11-10 13:52:37 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-04-01 20:28:51 -0600 |
commit | 09473be85c13eab0d794e363d898b74d66431d72 (patch) | |
tree | 3f82c08ac249fbe9c43628c8d4010b2a03f53ed3 /gdb | |
parent | a9f4c2f56f87c838c76b590b0ff5a66294e7e20b (diff) | |
download | binutils-09473be85c13eab0d794e363d898b74d66431d72.zip binutils-09473be85c13eab0d794e363d898b74d66431d72.tar.gz binutils-09473be85c13eab0d794e363d898b74d66431d72.tar.bz2 |
Change rs6000_ptrace_ldinfo to return a byte_vector
This changes rs6000_ptrace_ldinfo to return a byte_vector. I think
this points out an existing double-free in
rs6000_xfer_shared_libraries.
Tested by the buildbot.
gdb/ChangeLog
2018-04-01 Tom Tromey <tom@tromey.com>
* rs6000-nat.c (rs6000_ptrace_ldinfo): Return a byte_vector.
(rs6000_xfer_shared_libraries): Update.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/rs6000-nat.c | 32 |
2 files changed, 16 insertions, 21 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ed039e6..7e220ef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-04-01 Tom Tromey <tom@tromey.com> + + * rs6000-nat.c (rs6000_ptrace_ldinfo): Return a byte_vector. + (rs6000_xfer_shared_libraries): Update. + 2018-04-01 Simon Marchi <simon.marchi@polymtl.ca> * common/gdb_vecs.h (char_ptr): Remove. diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 4f05cd6..d8c15f0 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -583,25 +583,23 @@ rs6000_create_inferior (struct target_ops * ops, const char *exec_file, /* Shared Object support. */ /* Return the LdInfo data for the given process. Raises an error - if the data could not be obtained. + if the data could not be obtained. */ - The returned value must be deallocated after use. */ - -static gdb_byte * +static gdb::byte_vector rs6000_ptrace_ldinfo (ptid_t ptid) { const int pid = ptid_get_pid (ptid); - int ldi_size = 1024; - void *ldi = xmalloc (ldi_size); + gdb::byte_vector ldi (1024); int rc = -1; while (1) { if (ARCH64 ()) - rc = rs6000_ptrace64 (PT_LDINFO, pid, (unsigned long) ldi, ldi_size, - NULL); + rc = rs6000_ptrace64 (PT_LDINFO, pid, (unsigned long) ldi.data (), + ldi.size (), NULL); else - rc = rs6000_ptrace32 (PT_LDINFO, pid, (int *) ldi, ldi_size, NULL); + rc = rs6000_ptrace32 (PT_LDINFO, pid, (int *) ldi.data (), + ldi.size (), NULL); if (rc != -1) break; /* Success, we got the entire ld_info data. */ @@ -610,11 +608,10 @@ rs6000_ptrace_ldinfo (ptid_t ptid) perror_with_name (_("ptrace ldinfo")); /* ldi is not big enough. Double it and try again. */ - ldi_size *= 2; - ldi = xrealloc (ldi, ldi_size); + ldi.resize (ldi.size () * 2); } - return (gdb_byte *) ldi; + return ldi; } /* Implement the to_xfer_partial target_ops method for @@ -626,9 +623,7 @@ rs6000_xfer_shared_libraries const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) { - gdb_byte *ldi_buf; ULONGEST result; - struct cleanup *cleanup; /* This function assumes that it is being run with a live process. Core files are handled via gdbarch. */ @@ -637,14 +632,9 @@ rs6000_xfer_shared_libraries if (writebuf) return TARGET_XFER_E_IO; - ldi_buf = rs6000_ptrace_ldinfo (inferior_ptid); - gdb_assert (ldi_buf != NULL); - cleanup = make_cleanup (xfree, ldi_buf); - result = rs6000_aix_ld_info_to_xml (target_gdbarch (), ldi_buf, + gdb::byte_vector ldi_buf = rs6000_ptrace_ldinfo (inferior_ptid); + result = rs6000_aix_ld_info_to_xml (target_gdbarch (), ldi_buf.data (), readbuf, offset, len, 1); - xfree (ldi_buf); - - do_cleanups (cleanup); if (result == 0) return TARGET_XFER_EOF; |