From patchwork Sat Mar 3 03:23:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 26167 Received: (qmail 98047 invoked by alias); 3 Mar 2018 03:23:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 98035 invoked by uid 89); 3 Mar 2018 03:23:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=Hx-languages-length:4680 X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 03 Mar 2018 03:23:25 +0000 X-ASG-Debug-ID: 1520047400-0c856e618a1ef9c0001-fS2M51 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id r07qqS2MjPqHyWc4 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 02 Mar 2018 22:23:21 -0500 (EST) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (192-222-251-162.qc.cable.ebox.net [192.222.251.162]) by smtp.ebox.ca (Postfix) with ESMTP id 6668B441D66; Fri, 2 Mar 2018 22:23:20 -0500 (EST) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-251-162.qc.cable.ebox.net[192.222.251.162] X-Barracuda-Apparent-Source-IP: 192.222.251.162 X-Barracuda-RBL-IP: 192.222.251.162 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] Add xml_escape_text_append and use it Date: Fri, 2 Mar 2018 22:23:19 -0500 X-ASG-Orig-Subj: [PATCH] Add xml_escape_text_append and use it Message-Id: <20180303032319.30783-1-simon.marchi@polymtl.ca> In-Reply-To: <20180303030210.32627-1-simon.marchi@polymtl.ca> References: <20180303030210.32627-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1520047401 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5106 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.48515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-IsSubscribed: yes [This patch should go on top of "linux_qxfer_libraries_svr4: Use std::string", I should have sent them together as a series.] I noticed that linux_qxfer_libraries_svr4 used xml_escape_text, which returns an std::string. That string is then copied into a larger buffer. It would be more efficient if we had a version of xml_escape_text which appended to an existing string instead of returning a new one. This is what this patch does. I manually verified that the output of linux_qxfer_libraries_svr4 didn't change before/after the patch. gdb/ChangeLog: * common/xml-utils.c (xml_escape_text): Move code to... (xml_escape_text_append): ... this new function. * common/xml-utils.h (xml_escape_text_append): New declaration. * unittests/xml-utils-selftests.c (test_xml_escape_text_append): New function. (_initialize_xml_utils): register test_xml_escape_text_append as a selftest. gdb/gdbserver/ChangeLog: * linux-low.c (linux_qxfer_libraries_svr4): Use xml_escape_text_append. --- gdb/common/xml-utils.c | 27 +++++++++++++++++---------- gdb/common/xml-utils.h | 9 +++++++-- gdb/gdbserver/linux-low.c | 10 +++++----- gdb/unittests/xml-utils-selftests.c | 14 ++++++++++++++ 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/gdb/common/xml-utils.c b/gdb/common/xml-utils.c index aba1722cc0..3e1c2bfa7d 100644 --- a/gdb/common/xml-utils.c +++ b/gdb/common/xml-utils.c @@ -20,37 +20,44 @@ #include "common-defs.h" #include "xml-utils.h" -/* Return a string with special characters from TEXT replaced by entity - references. */ +/* See xml-utils.h. */ std::string xml_escape_text (const char *text) { std::string result; + xml_escape_text_append (&result, text); + + return result; +} + +/* See xml-utils.h. */ + +void +xml_escape_text_append (std::string *result, const char *text) +{ /* Expand the result. */ for (int i = 0; text[i] != '\0'; i++) switch (text[i]) { case '\'': - result += "'"; + *result += "'"; break; case '\"': - result += """; + *result += """; break; case '&': - result += "&"; + *result += "&"; break; case '<': - result += "<"; + *result += "<"; break; case '>': - result += ">"; + *result += ">"; break; default: - result += text[i]; + *result += text[i]; break; } - - return result; } diff --git a/gdb/common/xml-utils.h b/gdb/common/xml-utils.h index b874016334..3427ab246d 100644 --- a/gdb/common/xml-utils.h +++ b/gdb/common/xml-utils.h @@ -20,9 +20,14 @@ #ifndef XML_UTILS_H #define XML_UTILS_H -/* Return a malloc allocated string with special characters from TEXT - replaced by entity references. */ +/* Return a string with special characters from TEXT replaced by entity + references. */ extern std::string xml_escape_text (const char *text); +/* Append TEXT to RESULT, with special characters replaced by entity + references. */ + +extern void xml_escape_text_append (std::string *result, const char *text); + #endif diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 8a807576fc..4700475dd4 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -7137,12 +7137,12 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf, header_done = 1; } - std::string name = xml_escape_text ((char *) libname); - string_appendf (document, - "", - name.c_str (), (unsigned long) lm_addr, - (unsigned long) l_addr, (unsigned long) l_ld); + (unsigned long) lm_addr, (unsigned long) l_addr, + (unsigned long) l_ld); } } diff --git a/gdb/unittests/xml-utils-selftests.c b/gdb/unittests/xml-utils-selftests.c index 2457494d8c..1412773e18 100644 --- a/gdb/unittests/xml-utils-selftests.c +++ b/gdb/unittests/xml-utils-selftests.c @@ -33,6 +33,18 @@ static void test_xml_escape_text () SELF_CHECK (actual_output == expected_output); } +static void test_xml_escape_text_append () +{ + /* Make sure that we do indeed append. */ + std::string actual_output = "foo"; + const char *input = " &"; + const char *expected_output + = "foo<this isn't="xml"> &"; + xml_escape_text_append (&actual_output, input); + + SELF_CHECK (actual_output == expected_output); +} + } } @@ -41,4 +53,6 @@ _initialize_xml_utils () { selftests::register_test ("xml_escape_text", selftests::xml_utils::test_xml_escape_text); + selftests::register_test ("xml_escape_text_append", + selftests::xml_utils::test_xml_escape_text_append); }