Fix possible exception leak in python.c
authorTom Tromey <tom@tromey.com>
Sat, 8 Sep 2018 01:28:39 +0000 (19:28 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 15 Sep 2018 03:56:41 +0000 (21:56 -0600)
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
gdb/python/python.c

index 6fe0526..80e1ccd 100644 (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.
index 371f4a5..e89c90f 100644 (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;