Fix memory leak in exception code

PR gdb/24475 concerns a memory leak coming from gdb's exception
handling code.

The leak occurs because throw_exception_sjlj does not arrange to
destroy the exception object it is passed.  However, because
gdb_exception has a destructor, it's undefined to longjmp in this
situation.

This patch fixes the problem by avoiding the need to run any
destructors in gdb_rl_callback_handler, by making the gdb_exception
"static".

gdb/ChangeLog
2019-04-25  Tom Tromey  <tromey@adacore.com>

	PR gdb/24475:
	* event-top.c (gdb_rl_callback_handler): Make "gdb_rl_expt"
	static.
This commit is contained in:
Tom Tromey 2019-04-24 12:13:35 -06:00
parent 94aeb44b00
commit 3d1cbb7893
2 changed files with 11 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-04-25 Tom Tromey <tromey@adacore.com>
PR gdb/24475:
* event-top.c (gdb_rl_callback_handler): Make "gdb_rl_expt"
static.
2019-04-25 Tom Tromey <tromey@adacore.com>
* xml-support.c (struct gdb_xml_parser) <set_error>: Take an

View File

@ -205,11 +205,15 @@ gdb_rl_callback_read_char_wrapper (gdb_client_data client_data)
static void
gdb_rl_callback_handler (char *rl) noexcept
{
struct gdb_exception gdb_rl_expt;
/* This is static to avoid undefined behavior when calling longjmp
-- gdb_exception has a destructor with side effects. */
static struct gdb_exception gdb_rl_expt;
struct ui *ui = current_ui;
try
{
/* Ensure the exception is reset on each call. */
gdb_rl_expt = {};
ui->input_handler (gdb::unique_xmalloc_ptr<char> (rl));
}
catch (gdb_exception &ex)