diff options
author | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-01-26 12:29:00 +0100 |
---|---|---|
committer | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-02-06 21:04:53 +0100 |
commit | bb0da2b49689f49f01be2f8c5429945f37e12404 (patch) | |
tree | 1dc43fe35f3074664ef05d7e01d02ec3cdb449ac /gdb | |
parent | 424eb552c27a1574974d9052dff4ff252a7db22d (diff) | |
download | gdb-bb0da2b49689f49f01be2f8c5429945f37e12404.zip gdb-bb0da2b49689f49f01be2f8c5429945f37e12404.tar.gz gdb-bb0da2b49689f49f01be2f8c5429945f37e12404.tar.bz2 |
Fix leak of identifier in macro definition.
Valgrind detects leaks like the following (gdb.base/macscp.exp).
This patch fixes 1 of the 3 leaks (the last one in the list below).
The remaining leaks are better fixed in splay_tree_remove and
splay_tree_insert in libiberty.
Tested on debian/amd64, natively and under valgrind.
==22285== 64 (48 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 737 of 3,377
==22285== at 0x4C2BE6D: malloc (vg_replace_malloc.c:309)
==22285== by 0x4049E7: xmalloc (common-utils.c:44)
==22285== by 0x533A20: new_macro_key(macro_table*, char const*, macro_source_file*, int) (macrotab.c:355)
==22285== by 0x53438B: macro_define_function(macro_source_file*, int, char const*, int, char const**, char const*) (macrotab.c:822)
==22285== by 0x52F945: macro_define_command(char const*, int) (macrocmd.c:409)
...
==22285== 128 (96 direct, 32 indirect) bytes in 2 blocks are definitely lost in loss record 1,083 of 3,377
==22285== at 0x4C2BE6D: malloc (vg_replace_malloc.c:309)
==22285== by 0x4049E7: xmalloc (common-utils.c:44)
==22285== by 0x533A20: new_macro_key(macro_table*, char const*, macro_source_file*, int) (macrotab.c:355)
==22285== by 0x534277: macro_define_object_internal(macro_source_file*, int, char const*, char const*, macro_special_kind) (macrotab.c:776)
==22285== by 0x52F7E0: macro_define_command(char const*, int) (macrocmd.c:414)
...
==22285== 177 bytes in 19 blocks are definitely lost in loss record 1,193 of 3,377
==22285== at 0x4C2BE6D: malloc (vg_replace_malloc.c:309)
==22285== by 0x4049E7: xmalloc (common-utils.c:44)
==22285== by 0x52F5BD: extract_identifier(char const**, int) (macrocmd.c:316)
==22285== by 0x52F77D: macro_define_command(char const*, int) (macrocmd.c:355)
gdb/ChangeLog
2019-02-06 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* macrocmd.c (extract_identifier): Return
a gdb::unique_xmalloc_ptr<char> instead of a char *, and update
callers.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/macrocmd.c | 25 |
2 files changed, 17 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1ac3b55..87cba1c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2019-02-06 Philippe Waroquiers <philippe.waroquiers@skynet.be> + + * macrocmd.c (extract_identifier): Return + a gdb::unique_xmalloc_ptr<char> instead of a char *, and update + callers. + 2019-02-06 John Baldwin <jhb@FreeBSD.org> * fbsd-nat.c (fbsd_fetch_cmdline): Join arguments with spaces. diff --git a/gdb/macrocmd.c b/gdb/macrocmd.c index 706a835..beb9b78 100644 --- a/gdb/macrocmd.c +++ b/gdb/macrocmd.c @@ -288,7 +288,7 @@ skip_ws (const char **expp) function will also allow "..." forms as used in varargs macro parameters. */ -static char * +static gdb::unique_xmalloc_ptr<char> extract_identifier (const char **expp, int is_parameter) { char *result; @@ -317,7 +317,7 @@ extract_identifier (const char **expp, int is_parameter) memcpy (result, *expp, len); result[len] = '\0'; *expp += len; - return result; + return gdb::unique_xmalloc_ptr<char> (result); } struct temporary_macro_definition : public macro_definition @@ -346,14 +346,13 @@ static void macro_define_command (const char *exp, int from_tty) { temporary_macro_definition new_macro; - char *name = NULL; if (!exp) error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]")); skip_ws (&exp); - name = extract_identifier (&exp, 0); - if (! name) + gdb::unique_xmalloc_ptr<char> name = extract_identifier (&exp, 0); + if (name == NULL) error (_("Invalid macro name.")); if (*exp == '(') { @@ -380,7 +379,7 @@ macro_define_command (const char *exp, int from_tty) /* Must update new_macro as well... */ new_macro.argv = (const char * const *) argv; } - argv[new_macro.argc] = extract_identifier (&exp, 1); + argv[new_macro.argc] = extract_identifier (&exp, 1).release (); if (! argv[new_macro.argc]) error (_("Macro is missing an argument.")); ++new_macro.argc; @@ -404,14 +403,15 @@ macro_define_command (const char *exp, int from_tty) ++exp; skip_ws (&exp); - macro_define_function (macro_main (macro_user_macros), -1, name, + macro_define_function (macro_main (macro_user_macros), -1, name.get (), new_macro.argc, (const char **) new_macro.argv, exp); } else { skip_ws (&exp); - macro_define_object (macro_main (macro_user_macros), -1, name, exp); + macro_define_object (macro_main (macro_user_macros), -1, name.get (), + exp); } } @@ -419,17 +419,14 @@ macro_define_command (const char *exp, int from_tty) static void macro_undef_command (const char *exp, int from_tty) { - char *name; - if (!exp) error (_("usage: macro undef NAME")); skip_ws (&exp); - name = extract_identifier (&exp, 0); - if (! name) + gdb::unique_xmalloc_ptr<char> name = extract_identifier (&exp, 0); + if (name == nullptr) error (_("Invalid macro name.")); - macro_undef (macro_main (macro_user_macros), -1, name); - xfree (name); + macro_undef (macro_main (macro_user_macros), -1, name.get ()); } |