mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-26 11:33:45 +08:00
Use gdb::unique_xmalloc_ptr<char> in command_line_input to fix a leak
Following the change of logic where the input_handler gets a gdb::unique_xmalloc_ptr<char>, a call to readline directly followed by a call to handle_line_of_input is missing a free, and causes the below leak. Use gdb::unique_xmalloc_ptr<char> to solve the leak. ==16291== VALGRIND_GDB_ERROR_BEGIN ==16291== 64 bytes in 1 blocks are definitely lost in loss record 1,815 of 4,111 ==16291== at 0x4C2E2B3: realloc (vg_replace_malloc.c:836) ==16291== by 0x41EB1C: xrealloc (common-utils.c:62) ==16291== by 0x41DBD3: buffer_grow(buffer*, char const*, unsigned long) [clone .part.1] (buffer.c:40) ==16291== by 0x66E8FF: buffer_grow_char (buffer.h:40) ==16291== by 0x66E8FF: gdb_readline_no_editing (top.c:798) ==16291== by 0x66E8FF: command_line_input(char const*, char const*) (top.c:1249) ==16291== by 0x66EBD8: read_command_file(_IO_FILE*) (top.c:421) ==16291== by 0x412C0C: script_from_file(_IO_FILE*, char const*) (cli-script.c:1547) ==16291== by 0x40BE90: source_script_from_stream (cli-cmds.c:569) ==16291== by 0x40BE90: source_script_with_search(char const*, int, int) (cli-cmds.c:606) ==16291== by 0x54D567: catch_command_errors(void (*)(char const*, int), char const*, int) (main.c:379) ==16291== by 0x54EA84: captured_main_1 (main.c:994) ==16291== by 0x54EA84: captured_main (main.c:1167) ==16291== by 0x54EA84: gdb_main(captured_main_args*) (main.c:1193) ==16291== by 0x29DA27: main (gdb.c:32) ==16291== ==16291== VALGRIND_GDB_ERROR_END gdb/ChangeLog 2018-12-31 Philippe Waroquiers <philippe.waroquiers@skynet.be> * top.c (command_line_input): Use unique_xmalloc_ptr to manage memory allocated by readline.
This commit is contained in:
parent
8fd04a4255
commit
2139e8dc9f
@ -1,3 +1,8 @@
|
||||
2018-12-31 Philippe Waroquiers <philippe.waroquiers@skynet.be>
|
||||
|
||||
* top.c (command_line_input): Use unique_xmalloc_ptr to
|
||||
manage memory allocated by readline.
|
||||
|
||||
2018-12-30 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* event-top.h (command_line_handler): Update.
|
||||
|
10
gdb/top.c
10
gdb/top.c
@ -1212,7 +1212,7 @@ command_line_input (const char *prompt_arg, const char *annotation_suffix)
|
||||
|
||||
while (1)
|
||||
{
|
||||
char *rl;
|
||||
gdb::unique_xmalloc_ptr<char> rl;
|
||||
|
||||
/* Make sure that all output has been output. Some machines may
|
||||
let you get away with leaving out some of the gdb_flush, but
|
||||
@ -1236,20 +1236,20 @@ command_line_input (const char *prompt_arg, const char *annotation_suffix)
|
||||
&& from_tty
|
||||
&& input_interactive_p (current_ui))
|
||||
{
|
||||
rl = (*deprecated_readline_hook) (prompt);
|
||||
rl.reset ((*deprecated_readline_hook) (prompt));
|
||||
}
|
||||
else if (command_editing_p
|
||||
&& from_tty
|
||||
&& input_interactive_p (current_ui))
|
||||
{
|
||||
rl = gdb_readline_wrapper (prompt);
|
||||
rl.reset (gdb_readline_wrapper (prompt));
|
||||
}
|
||||
else
|
||||
{
|
||||
rl = gdb_readline_no_editing (prompt);
|
||||
rl.reset (gdb_readline_no_editing (prompt));
|
||||
}
|
||||
|
||||
cmd = handle_line_of_input (&cmd_line_buffer, rl,
|
||||
cmd = handle_line_of_input (&cmd_line_buffer, rl.get (),
|
||||
0, annotation_suffix);
|
||||
if (cmd == (char *) EOF)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user