[Ada] Raise exception on call to Expect for a dead process
authorVadim Godunko <godunko@adacore.com>
Wed, 18 Sep 2019 08:32:14 +0000 (08:32 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Sep 2019 08:32:14 +0000 (08:32 +0000)
Call to Expect for a dead process results in SIGBUS signal on Linux
systems. Process_Died exception is raised in this case now.

2019-09-18  Vadim Godunko  <godunko@adacore.com>

gcc/ada/

* libgnat/g-expect.adb (Expect_Internal): Don't include invalid
file descriptors into the set of file descriptors for Poll.
Raise Process_Died exception when computed set of file
descriptors to monitor is empty.

gcc/testsuite/

* gnat.dg/expect4.adb: New testcase.

From-SVN: r275847

gcc/ada/ChangeLog
gcc/ada/libgnat/g-expect.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/expect4.adb [new file with mode: 0644]

index 38c5a7ee16469b94b61138d7919eda0abebe45f9..b110539176e76d92e15849848898ac794ecf4ba4 100644 (file)
@@ -1,3 +1,10 @@
+2019-09-18  Vadim Godunko  <godunko@adacore.com>
+
+       * libgnat/g-expect.adb (Expect_Internal): Don't include invalid
+       file descriptors into the set of file descriptors for Poll.
+       Raise Process_Died exception when computed set of file
+       descriptors to monitor is empty.
+
 2019-09-18  Frederic Konrad  <konrad@adacore.com>
 
        * adaint.c: Include dosFsLib.h and vwModNum.h for VxWorks 6.
index 0ee010e4cfbea02f42b7ab8d281a84b31c26506d..4efd98d850457e8ff0cdbc28b3d2f2925ca1a6cc 100644 (file)
@@ -653,7 +653,9 @@ package body GNAT.Expect is
 
    begin
       for J in Descriptors'Range loop
-         if Descriptors (J) /= null then
+         if Descriptors (J) /= null
+           and then Descriptors (J).Output_Fd /= Invalid_FD
+         then
             Fds (Fds'First + Fds_Count) := Descriptors (J).Output_Fd;
             Fds_To_Descriptor (Fds'First + Fds_Count) := J;
             Fds_Count := Fds_Count + 1;
@@ -667,6 +669,14 @@ package body GNAT.Expect is
          end if;
       end loop;
 
+      if Fds_Count = 0 then
+         --  There are no descriptors to monitor, it means that process died.
+
+         Result := Expect_Process_Died;
+
+         return;
+      end if;
+
       declare
          Buffer : aliased String (1 .. Buffer_Size);
          --  Buffer used for input. This is allocated only once, not for
index c3f82a5f1a8a89884e4f2fb449776767862f109b..e0ac52957f0183cc120dc08f9354a1ae7079cad2 100644 (file)
@@ -1,3 +1,7 @@
+2019-09-18  Vadim Godunko  <godunko@adacore.com>
+
+       * gnat.dg/expect4.adb: New testcase.
+
 2019-09-18  Steve Baird  <baird@adacore.com>
 
        * gnat.dg/ghost7.adb, gnat.dg/ghost7.ads: New testcase.
diff --git a/gcc/testsuite/gnat.dg/expect4.adb b/gcc/testsuite/gnat.dg/expect4.adb
new file mode 100644 (file)
index 0000000..7a974cc
--- /dev/null
@@ -0,0 +1,35 @@
+--  { dg-do run }
+
+with GNAT.Expect.TTY;
+with GNAT.OS_Lib;
+
+procedure Expect4 is
+   Pid    : GNAT.Expect.TTY.TTY_Process_Descriptor;
+   Args   : GNAT.OS_Lib.Argument_List (1 .. 0);
+   Result : GNAT.Expect.Expect_Match;
+
+begin
+   Pid.Non_Blocking_Spawn ("true", Args);
+
+   begin
+      Pid.Expect (Result, ".*");
+
+      raise Program_Error;
+
+   exception
+      when GNAT.Expect.Process_Died =>
+         null;
+   end;
+
+   begin
+      Pid.Expect (Result, ".*");
+
+      raise Program_Error;
+
+   exception
+      when GNAT.Expect.Process_Died =>
+         null;
+   end;
+
+   Pid.Close;
+end Expect4;
\ No newline at end of file