From 04fd3ba9b63936653fff2b1657b3824c94a8efd6 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sat, 16 Sep 2017 14:22:11 +0200 Subject: [PATCH] Refactor handle_qxfer_libraries and friends to use std::string Using std::string in handle_qxfer_libraries and friends allow to simplify the code. We don't have to manually free the buffer, and we don't have to pre-compute the required space. gdb/gdbserver/ChangeLog: * server.c (accumulate_file_name_length): Remove. (emit_dll_description): Adjust to std::string change. (handle_qxfer_libraries): Use std::string to hold document. --- gdb/gdbserver/ChangeLog | 6 ++++ gdb/gdbserver/server.c | 68 ++++++++--------------------------------- 2 files changed, 19 insertions(+), 55 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 49a76c94f60..00e789187e7 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2017-09-16 Simon Marchi + + * server.c (accumulate_file_name_length): Remove. + (emit_dll_description): Adjust to std::string change. + (handle_qxfer_libraries): Use std::string to hold document. + 2017-09-16 Simon Marchi * linux-low.c (linux_qxfer_libraries_svr4): Adjust to change of diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 92943e2e6f3..f4faff9d77f 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1508,21 +1508,6 @@ handle_qxfer_features (const char *annex, return len; } -/* Worker routine for handle_qxfer_libraries. - Add to the length pointed to by ARG a conservative estimate of the - length needed to transmit the file name of INF. */ - -static void -accumulate_file_name_length (struct inferior_list_entry *inf, void *arg) -{ - struct dll_info *dll = (struct dll_info *) inf; - unsigned int *total_len = (unsigned int *) arg; - - /* Over-estimate the necessary memory. Assume that every character - in the library name must be escaped. */ - *total_len += 128 + 6 * strlen (dll->name); -} - /* Worker routine for handle_qxfer_libraries. Emit the XML to describe the library in INF. */ @@ -1530,22 +1515,12 @@ static void emit_dll_description (struct inferior_list_entry *inf, void *arg) { struct dll_info *dll = (struct dll_info *) inf; - char **p_ptr = (char **) arg; - char *p = *p_ptr; - - strcpy (p, " name); - strcpy (p, name.c_str ()); - p = p + strlen (p); - strcpy (p, "\">base_addr); - p = p + strlen (p); - strcpy (p, "\"/>\n"); - p = p + strlen (p); - - *p_ptr = p; + + *document += string_printf + (" \n", + name.c_str (), (long) dll->base_addr); } /* Handle qXfer:libraries:read. */ @@ -1555,43 +1530,26 @@ handle_qxfer_libraries (const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len) { - unsigned int total_len; - char *document, *p; - if (writebuf != NULL) return -2; if (annex[0] != '\0' || current_thread == NULL) return -1; - total_len = 64; - for_each_inferior_with_data (&all_dlls, accumulate_file_name_length, - &total_len); - - document = (char *) malloc (total_len); - if (document == NULL) - return -1; - - strcpy (document, "\n"); - p = document + strlen (document); + std::string document = "\n"; - for_each_inferior_with_data (&all_dlls, emit_dll_description, &p); + for_each_inferior_with_data (&all_dlls, emit_dll_description, &document); - strcpy (p, "\n"); + document += "\n"; - total_len = strlen (document); + if (offset > document.length ()) + return -1; - if (offset > total_len) - { - free (document); - return -1; - } + if (offset + len > document.length ()) + len = document.length () - offset; - if (offset + len > total_len) - len = total_len - offset; + memcpy (readbuf, &document[offset], len); - memcpy (readbuf, document + offset, len); - free (document); return len; } -- 2.30.2