Fix possible exception leak in python.c

In the Python code, gdb exceptions may not leak into the Python core.
execute_gdb_command was calling bpstat_do_actions outside of a
TRY/CATCH; which seemed risky.  I don't have a test case for this, but
if bpstat_do_actions could ever throw, it could crash gdb.

This patch introduces a new scope in order to preserve the current
semantics, so it is looks a bit bigger than it really is.

Tested on x86-64 Fedora 28.

gdb/ChangeLog
2018-09-07  Tom Tromey  <tom@tromey.com>

	* python/python.c (execute_gdb_command): Call bpstat_do_actions
	inside the TRY.
This commit is contained in:
Tom Tromey 2018-09-07 19:28:39 -06:00
parent f70e088ff4
commit a3a6aef409
2 changed files with 23 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2018-09-07 Tom Tromey <tom@tromey.com>
* python/python.c (execute_gdb_command): Call bpstat_do_actions
inside the TRY.
2018-09-14 Sandra Loosemore <sandra@codesourcery.com>
* nios2-tdep.c (nios2_type_align): New.

View File

@ -602,21 +602,27 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
{
scoped_restore save_async = make_scoped_restore (&current_ui->async,
0);
scoped_restore save_uiout = make_scoped_restore (&current_uiout);
scoped_restore save_uiout = make_scoped_restore (&current_uiout);
/* Use the console interpreter uiout to have the same print format
for console or MI. */
interp = interp_lookup (current_ui, "console");
current_uiout = interp->interp_ui_out ();
/* Use the console interpreter uiout to have the same print format
for console or MI. */
interp = interp_lookup (current_ui, "console");
current_uiout = interp->interp_ui_out ();
scoped_restore preventer = prevent_dont_repeat ();
if (to_string)
to_string_res = execute_control_commands_to_string (lines.get (),
from_tty);
else
execute_control_commands (lines.get (), from_tty);
scoped_restore preventer = prevent_dont_repeat ();
if (to_string)
to_string_res = execute_control_commands_to_string (lines.get (),
from_tty);
else
execute_control_commands (lines.get (), from_tty);
}
/* Do any commands attached to breakpoint we stopped at. */
bpstat_do_actions ();
}
CATCH (except, RETURN_MASK_ALL)
{
@ -624,9 +630,6 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
}
END_CATCH
/* Do any commands attached to breakpoint we stopped at. */
bpstat_do_actions ();
if (to_string)
return PyString_FromString (to_string_res.c_str ());
Py_RETURN_NONE;