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.
This commit is contained in:
parent
6ff79ccd1c
commit
0d0b0ea29a
2 changed files with 14 additions and 11 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2018-06-20 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* python/py-param.c (add_setshow_generic): Make parameters const.
|
||||||
|
(parmpy_init): Update.
|
||||||
|
|
||||||
2018-06-20 Simon Marchi <simon.marchi@polymtl.ca>
|
2018-06-20 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* regcache.h (regcache_cooked_read_ftype): Rename to...
|
* regcache.h (regcache_cooked_read_ftype): Rename to...
|
||||||
|
|
|
@ -465,8 +465,9 @@ get_show_value (struct ui_file *file, int from_tty,
|
||||||
function. */
|
function. */
|
||||||
static void
|
static void
|
||||||
add_setshow_generic (int parmclass, enum command_class cmdclass,
|
add_setshow_generic (int parmclass, enum command_class cmdclass,
|
||||||
char *cmd_name, parmpy_object *self,
|
const char *cmd_name, parmpy_object *self,
|
||||||
char *set_doc, char *show_doc, char *help_doc,
|
const char *set_doc, const char *show_doc,
|
||||||
|
const char *help_doc,
|
||||||
struct cmd_list_element **set_list,
|
struct cmd_list_element **set_list,
|
||||||
struct cmd_list_element **show_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;
|
parmpy_object *obj = (parmpy_object *) self;
|
||||||
const char *name;
|
const char *name;
|
||||||
char *set_doc, *show_doc, *doc;
|
gdb::unique_xmalloc_ptr<char> set_doc, show_doc, doc;
|
||||||
char *cmd_name;
|
char *cmd_name;
|
||||||
int parmclass, cmdtype;
|
int parmclass, cmdtype;
|
||||||
PyObject *enum_values = NULL;
|
PyObject *enum_values = NULL;
|
||||||
|
@ -723,9 +724,9 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
|
||||||
if (! cmd_name)
|
if (! cmd_name)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
set_doc = get_doc_string (self, set_doc_cst).release ();
|
set_doc = get_doc_string (self, set_doc_cst);
|
||||||
show_doc = get_doc_string (self, show_doc_cst).release ();
|
show_doc = get_doc_string (self, show_doc_cst);
|
||||||
doc = get_doc_string (self, gdbpy_doc_cst).release ();
|
doc = get_doc_string (self, gdbpy_doc_cst);
|
||||||
|
|
||||||
Py_INCREF (self);
|
Py_INCREF (self);
|
||||||
|
|
||||||
|
@ -733,15 +734,12 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
add_setshow_generic (parmclass, (enum command_class) cmdtype,
|
add_setshow_generic (parmclass, (enum command_class) cmdtype,
|
||||||
cmd_name, obj,
|
cmd_name, obj,
|
||||||
set_doc, show_doc,
|
set_doc.get (), show_doc.get (),
|
||||||
doc, set_list, show_list);
|
doc.get (), set_list, show_list);
|
||||||
}
|
}
|
||||||
CATCH (except, RETURN_MASK_ALL)
|
CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
xfree (cmd_name);
|
xfree (cmd_name);
|
||||||
xfree (set_doc);
|
|
||||||
xfree (show_doc);
|
|
||||||
xfree (doc);
|
|
||||||
Py_DECREF (self);
|
Py_DECREF (self);
|
||||||
PyErr_Format (except.reason == RETURN_QUIT
|
PyErr_Format (except.reason == RETURN_QUIT
|
||||||
? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
|
? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue