From f5e976a5b5424c7d517669d22afb0cbcbceceffe Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Fri, 18 Sep 2009 15:50:26 +0200 Subject: [PATCH] [multiple changes] 2009-09-18 Thomas Quinot * g-socket.adb (Is_Open): New function indicating whether a Selector_Type object is open. 2009-09-18 Vincent Celier * osint-c.adb (Create_Output_Library_Info): Make sure that the ALI file is deleted before creating it. 2009-09-18 Robert Dewar * bindgen.adb: Minor reformatting From-SVN: r151842 --- gcc/ada/ChangeLog | 14 ++++++++++++ gcc/ada/bindgen.adb | 3 +-- gcc/ada/g-socket.adb | 52 ++++++++++++++++++++++++++------------------ gcc/ada/osint-c.adb | 6 ++++- 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f763a28b7f7..647ff0746db 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,17 @@ +2009-09-18 Thomas Quinot + + * g-socket.adb (Is_Open): New function indicating whether a + Selector_Type object is open. + +2009-09-18 Vincent Celier + + * osint-c.adb (Create_Output_Library_Info): Make sure that the ALI file + is deleted before creating it. + +2009-09-18 Robert Dewar + + * bindgen.adb: Minor reformatting + 2009-09-18 Arnaud Charlet * s-taprop-tru64.adb, s-taprop-linux.adb, s-taprop-solaris.adb, diff --git a/gcc/ada/bindgen.adb b/gcc/ada/bindgen.adb index ce81c7ae005..182586133ae 100644 --- a/gcc/ada/bindgen.adb +++ b/gcc/ada/bindgen.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2008, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2009, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -198,7 +198,6 @@ package body Bindgen is -- Zero_Cost_Exceptions is set to one if zero cost exceptions are used for -- this partition, and to zero if longjmp/setjmp exceptions are used. - -- the use of zero -- Detect_Blocking indicates whether pragma Detect_Blocking is active or -- not. A value of zero indicates that the pragma is not present, while a diff --git a/gcc/ada/g-socket.adb b/gcc/ada/g-socket.adb index 8afde3beec3..7741dc0c76d 100644 --- a/gcc/ada/g-socket.adb +++ b/gcc/ada/g-socket.adb @@ -265,6 +265,10 @@ package body GNAT.Sockets is -- fd_set component is actually cleared. Note that the case where it is -- not can occur for an uninitialized Socket_Set_Type object. + function Is_Open (S : Selector_Type) return Boolean; + -- Return True for an "open" Selector_Type object, i.e. one for which + -- Create_Selector has been called and Close_Selector has not been called. + --------- -- "+" -- --------- @@ -282,9 +286,7 @@ package body GNAT.Sockets is Res : C.int; begin - if Selector.R_Sig_Socket = No_Socket - or else Selector.W_Sig_Socket = No_Socket - then + if not Is_Open (Selector) then raise Program_Error with "closed selector"; end if; @@ -336,11 +338,7 @@ package body GNAT.Sockets is Status : out Selector_Status) is begin - if Selector /= null - and then (Selector.R_Sig_Socket = No_Socket - or else - Selector.W_Sig_Socket = No_Socket) - then + if Selector /= null and then not Is_Open (Selector.all) then raise Program_Error with "closed selector"; end if; @@ -492,9 +490,7 @@ package body GNAT.Sockets is TPtr : Timeval_Access; begin - if Selector.R_Sig_Socket = No_Socket - or else Selector.W_Sig_Socket = No_Socket - then + if not Is_Open (Selector) then raise Program_Error with "closed selector"; end if; @@ -583,9 +579,10 @@ package body GNAT.Sockets is procedure Close_Selector (Selector : in out Selector_Type) is begin - if Selector.R_Sig_Socket = No_Socket - or else Selector.W_Sig_Socket = No_Socket - then + if not Is_Open (Selector) then + + -- Selector already in closed state: nothing to do + return; end if; @@ -662,10 +659,7 @@ package body GNAT.Sockets is -- Used to set Socket to non-blocking I/O begin - if Selector /= null and then - (Selector.R_Sig_Socket = No_Socket - or else Selector.W_Sig_Socket = No_Socket) - then + if Selector /= null and then not Is_Open (Selector.all) then raise Program_Error with "closed selector"; end if; @@ -760,9 +754,9 @@ package body GNAT.Sockets is Res : C.int; begin - if Selector.R_Sig_Socket /= No_Socket - or else Selector.W_Sig_Socket /= No_Socket - then + if Is_Open (Selector) then + -- Raise exception to prevent socket descriptor leak + raise Program_Error with "selector already open"; end if; @@ -1392,6 +1386,22 @@ package body GNAT.Sockets is return True; end Is_IP_Address; + ------------- + -- Is_Open -- + ------------- + + function Is_Open (S : Selector_Type) return Boolean is + begin + -- Either both controlling socket descriptors are valid (case of an + -- open selector) or neither (case of a closed selector). + + pragma Assert ((S.R_Sig_Socket /= No_Socket) + = + (S.W_Sig_Socket /= No_Socket)); + + return S.R_Sig_Socket /= No_Socket; + end Is_Open; + ------------ -- Is_Set -- ------------ diff --git a/gcc/ada/osint-c.adb b/gcc/ada/osint-c.adb index a93573e7754..8b67befc6c6 100644 --- a/gcc/ada/osint-c.adb +++ b/gcc/ada/osint-c.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2001-2008, Free Software Foundation, Inc. -- +-- Copyright (C) 2001-2009, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -202,8 +202,12 @@ package body Osint.C is -------------------------------- procedure Create_Output_Library_Info is + Dummy : Boolean; + pragma Unreferenced (Dummy); + begin Set_Library_Info_Name; + Delete_File (Name_Buffer (1 .. Name_Len), Dummy); Create_File_And_Check (Output_FD, Text); end Create_Output_Library_Info;