aboutsummaryrefslogtreecommitdiff
path: root/gdb/event-top.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-04-24 12:13:35 -0600
committerTom Tromey <tromey@adacore.com>2019-04-25 12:59:35 -0600
commit3d1cbb78936fbf2985ffd2ebf074841599ead788 (patch)
tree728d88d63e015063cbe01606711f2b0b3153dbd2 /gdb/event-top.c
parent94aeb44b001ab2d632806242a3bacb0a879abe15 (diff)
downloadgdb-3d1cbb78936fbf2985ffd2ebf074841599ead788.zip
gdb-3d1cbb78936fbf2985ffd2ebf074841599ead788.tar.gz
gdb-3d1cbb78936fbf2985ffd2ebf074841599ead788.tar.bz2
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.
Diffstat (limited to 'gdb/event-top.c')
-rw-r--r--gdb/event-top.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 9fa46c8..3ccf136 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -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)