Use gdb::optional for sigint_ours
authorTom Tromey <tromey@adacore.com>
Mon, 12 Dec 2022 17:17:18 +0000 (10:17 -0700)
committerTom Tromey <tromey@adacore.com>
Tue, 13 Dec 2022 19:51:53 +0000 (12:51 -0700)
sigint_ours (and sigquit_ours) can be used without being set.  Avoid
this problem by changing them to gdb::optional and checking that they
are in fact set before using the value.

gdb/inflow.c

index 5477624bcd5bb68a1f8ae51cf9cad315a8e6f90b..da2005a931814426eb69c70dff30ea9a8319767d 100644 (file)
@@ -113,9 +113,9 @@ static struct terminal_info *get_inflow_inferior_data (struct inferior *);
    we save our handlers in these two variables and set SIGINT and SIGQUIT
    to SIG_IGN.  */
 
-static sighandler_t sigint_ours;
+static gdb::optional<sighandler_t> sigint_ours;
 #ifdef SIGQUIT
-static sighandler_t sigquit_ours;
+static gdb::optional<sighandler_t> sigquit_ours;
 #endif
 
 /* The name of the tty (from the `tty' command) that we're giving to
@@ -501,9 +501,13 @@ child_terminal_ours_1 (target_terminal_state desired_state)
 
       if (!job_control && desired_state == target_terminal_state::is_ours)
        {
-         signal (SIGINT, sigint_ours);
+         if (sigint_ours.has_value ())
+           signal (SIGINT, *sigint_ours);
+         sigint_ours.reset ();
 #ifdef SIGQUIT
-         signal (SIGQUIT, sigquit_ours);
+         if (sigquit_ours.has_value ())
+           signal (SIGQUIT, *sigquit_ours);
+         sigquit_ours.reset ();
 #endif
        }