From patchwork Wed Jun 20 21:38:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 27955 Received: (qmail 117216 invoked by alias); 20 Jun 2018 21:38:44 -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 117196 invoked by uid 89); 20 Jun 2018 21:38:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=apparent, H*RU:sk:cm12.we, H*RU:100.42.49.8, xfree X-HELO: gateway23.websitewelcome.com Received: from gateway23.websitewelcome.com (HELO gateway23.websitewelcome.com) (192.185.49.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 20 Jun 2018 21:38:41 +0000 Received: from cm12.websitewelcome.com (cm12.websitewelcome.com [100.42.49.8]) by gateway23.websitewelcome.com (Postfix) with ESMTP id 20E1E11314 for ; Wed, 20 Jun 2018 16:38:40 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id VkoJfbqTFSjJAVkoJf9Hdp; Wed, 20 Jun 2018 16:38:40 -0500 X-Authority-Reason: nr=8 Received: from 75-166-79-120.hlrn.qwest.net ([75.166.79.120]:44310 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1fVkoJ-002D4l-8g; Wed, 20 Jun 2018 16:38:39 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA] Fix a memory leak in py-param.c Date: Wed, 20 Jun 2018 15:38:36 -0600 Message-Id: <20180620213836.3980-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1fVkoJ-002D4l-8g X-Source-Sender: 75-166-79-120.hlrn.qwest.net (bapiya.Home) [75.166.79.120]:44310 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes Mark Wielaard pointed out this memory leak to me: ==17633== 775 bytes in 1 blocks are definitely lost in loss record 13,346 of 13,967 ==17633== at 0x4C2DB6B: malloc (vg_replace_malloc.c:299) ==17633== by 0x6652B7: xmalloc (common-utils.c:45) ==17633== by 0xC4C889: xstrdup (xstrdup.c:34) ==17633== by 0x5A71FD: unicode_to_encoded_string(_object*, char const*) (py-utils.c:81) ==17633== by 0x5A73EB: python_string_to_host_string(_object*) (py-utils.c:158) ==17633== by 0x59CC6C: get_doc_string(_object*, _object*) (py-param.c:334) ==17633== by 0x59D2AA: parmpy_init(_object*, _object*, _object*) (py-param.c:728) The bug here is that parmpy_init is written as though add_setshow_generic takes ownership of its doc-string arguments. However, it does not. This patch fixes the bug in a straightforward way and also applies some missing constification to make the problem more apparent. Tested on x86-64 Fedora 26. gdb/ChangeLog 2018-06-20 Tom Tromey * python/py-param.c (add_setshow_generic): Make parameters const. (parmpy_init): Update. --- gdb/ChangeLog | 5 +++++ gdb/python/py-param.c | 20 +++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index ef5c91b9ba1..0f0214befe0 100644 --- a/gdb/python/py-param.c +++ b/gdb/python/py-param.c @@ -465,8 +465,9 @@ get_show_value (struct ui_file *file, int from_tty, function. */ static void add_setshow_generic (int parmclass, enum command_class cmdclass, - char *cmd_name, parmpy_object *self, - char *set_doc, char *show_doc, char *help_doc, + const char *cmd_name, parmpy_object *self, + const char *set_doc, const char *show_doc, + const char *help_doc, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { @@ -662,7 +663,7 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) { parmpy_object *obj = (parmpy_object *) self; const char *name; - char *set_doc, *show_doc, *doc; + gdb::unique_xmalloc_ptr set_doc, show_doc, doc; char *cmd_name; int parmclass, cmdtype; PyObject *enum_values = NULL; @@ -723,9 +724,9 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) if (! cmd_name) return -1; - set_doc = get_doc_string (self, set_doc_cst).release (); - show_doc = get_doc_string (self, show_doc_cst).release (); - doc = get_doc_string (self, gdbpy_doc_cst).release (); + set_doc = get_doc_string (self, set_doc_cst); + show_doc = get_doc_string (self, show_doc_cst); + doc = get_doc_string (self, gdbpy_doc_cst); Py_INCREF (self); @@ -733,15 +734,12 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) { add_setshow_generic (parmclass, (enum command_class) cmdtype, cmd_name, obj, - set_doc, show_doc, - doc, set_list, show_list); + set_doc.get (), show_doc.get (), + doc.get (), set_list, show_list); } CATCH (except, RETURN_MASK_ALL) { xfree (cmd_name); - xfree (set_doc); - xfree (show_doc); - xfree (doc); Py_DECREF (self); PyErr_Format (except.reason == RETURN_QUIT ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,