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.
+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>
* regcache.h (regcache_cooked_read_ftype): Rename to...
2018-06-20 Simon Marchi <simon.marchi@polymtl.ca>
* regcache.h (regcache_cooked_read_ftype): Rename to...
function. */
static void
add_setshow_generic (int parmclass, enum command_class cmdclass,
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)
{
struct cmd_list_element **set_list,
struct cmd_list_element **show_list)
{
{
parmpy_object *obj = (parmpy_object *) self;
const char *name;
{
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;
char *cmd_name;
int parmclass, cmdtype;
PyObject *enum_values = NULL;
if (! cmd_name)
return -1;
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);
{
add_setshow_generic (parmclass, (enum command_class) cmdtype,
cmd_name, obj,
{
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);
}
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,
Py_DECREF (self);
PyErr_Format (except.reason == RETURN_QUIT
? PyExc_KeyboardInterrupt : PyExc_RuntimeError,