[FYI] Fix possible exception leak in python.c

Tom Tromey tom@tromey.com
Sat Sep 15 03:58:00 GMT 2018


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.
---
 gdb/ChangeLog       |  5 +++++
 gdb/python/python.c | 33 ++++++++++++++++++---------------
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/gdb/python/python.c b/gdb/python/python.c
index 371f4a57529..e89c90f8d9f 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -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;
-- 
2.17.1



More information about the Gdb-patches mailing list