[Ada] Raise exception on call to Expect for a dead process

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
This commit is contained in:
Vadim Godunko 2019-09-18 08:32:14 +00:00 committed by Pierre-Marie de Rodat
parent 82fa20a211
commit 209a0094c4
4 changed files with 57 additions and 1 deletions

View 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.

View 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

View 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.

View File

@ -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;