diff options
author | Tom Tromey <tom@tromey.com> | 2018-06-20 15:35:04 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-06-20 21:10:10 -0600 |
commit | 0d0b0ea29af6abc0790d22f843a3d0cb09424a3a (patch) | |
tree | 1e8471fecfd1c30298679c7e45d1fd797c6b2af9 /gdb/python/py-param.c | |
parent | 6ff79ccd1ca06a4c557ee81b73e0a535b9fd6001 (diff) | |
download | gdb-0d0b0ea29af6abc0790d22f843a3d0cb09424a3a.zip gdb-0d0b0ea29af6abc0790d22f843a3d0cb09424a3a.tar.gz gdb-0d0b0ea29af6abc0790d22f843a3d0cb09424a3a.tar.bz2 |
Fix a memory leak in py-param.c
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 <tom@tromey.com>
* python/py-param.c (add_setshow_generic): Make parameters const.
(parmpy_init): Update.
Diffstat (limited to 'gdb/python/py-param.c')
-rw-r--r-- | gdb/python/py-param.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index ef5c91b..0f0214b 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<char> 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, |