diff options
author | Tom Tromey <tromey@adacore.com> | 2019-04-24 12:13:35 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2019-04-25 12:59:35 -0600 |
commit | 3d1cbb78936fbf2985ffd2ebf074841599ead788 (patch) | |
tree | 728d88d63e015063cbe01606711f2b0b3153dbd2 /gdb/event-top.c | |
parent | 94aeb44b001ab2d632806242a3bacb0a879abe15 (diff) | |
download | gdb-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.c | 6 |
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) |