diff options
author | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-03-22 13:59:02 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-03-22 13:59:02 +0000 |
commit | 29e0246c68efd4b68f9593ff26b3c123fb05161d (patch) | |
tree | d8fc70816991d4f49a5255aa5fe952ed585e5ff1 | |
parent | b6c5f9f3dd489efa345175c8ac1352fa2849d32c (diff) | |
download | gcc-29e0246c68efd4b68f9593ff26b3c123fb05161d.zip gcc-29e0246c68efd4b68f9593ff26b3c123fb05161d.tar.gz gcc-29e0246c68efd4b68f9593ff26b3c123fb05161d.tar.bz2 |
[Ada] GNAT.Sockets: fix recent regressions
The support for IPv6 that was added since last release triggered
regressions on various platforms. The size of structures passed to low
level routines was not correct anymore: it should depend on the address
family, now.
2019-03-22 Dmitriy Anisimkov <anisimko@adacore.com>
gcc/ada/
PR ada/89583
* libgnat/g-socket.adb (Bind_Socket, Connect_Socket,
Send_Socket): Fix the computation of structure lengths passed to
low level routines.
(Is_IPv6_Address): Fix the number of expected colons.
2019-03-22 Simon Wright <simon@pushface.org>
gcc/testsuite/
PR ada/89583
* gnat.dg/socket2.adb: New.
From-SVN: r269873
-rw-r--r-- | gcc/ada/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ada/libgnat/g-socket.adb | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/socket2.adb | 16 |
4 files changed, 35 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6cb5389..81b5db9 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2019-03-22 Dmitriy Anisimkov <anisimko@adacore.com> + + PR ada/89583 + * libgnat/g-socket.adb (Bind_Socket, Connect_Socket, + Send_Socket): Fix the computation of structure lengths passed to + low level routines. + (Is_IPv6_Address): Fix the number of expected colons. + 2019-03-11 Martin Liska <mliska@suse.cz> * gcc-interface/misc.c (gnat_post_options): Wrap option name in string diff --git a/gcc/ada/libgnat/g-socket.adb b/gcc/ada/libgnat/g-socket.adb index c0b3079..476a213 100644 --- a/gcc/ada/libgnat/g-socket.adb +++ b/gcc/ada/libgnat/g-socket.adb @@ -461,12 +461,12 @@ package body GNAT.Sockets is is Res : C.int; Sin : aliased Sockaddr; - Len : constant C.int := Sin'Size / 8; begin Set_Address (Sin'Unchecked_Access, Address); - Res := C_Bind (C.int (Socket), Sin'Address, Len); + Res := C_Bind + (C.int (Socket), Sin'Address, C.int (Lengths (Address.Family))); if Res = Failure then Raise_Socket_Error (Socket_Errno); @@ -666,12 +666,11 @@ package body GNAT.Sockets is Server : Sock_Addr_Type) return C.int is Sin : aliased Sockaddr; - Len : constant C.int := Sin'Size / 8; - begin Set_Address (Sin'Unchecked_Access, Server); - return C_Connect (C.int (Socket), Sin'Address, Len); + return C_Connect + (C.int (Socket), Sin'Address, C.int (Lengths (Server.Family))); end Connect_Socket; procedure Connect_Socket @@ -1794,7 +1793,7 @@ package body GNAT.Sockets is end if; end loop; - return Colons <= 7; + return Colons <= 8; end Is_IPv6_Address; --------------------- @@ -2403,7 +2402,7 @@ package body GNAT.Sockets is if To /= null then Set_Address (Sin'Unchecked_Access, To.all); C_To := Sin'Address; - Len := Sin'Size / 8; + Len := C.int (Thin_Common.Lengths (To.Family)); else C_To := System.Null_Address; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6f17f24..2fee0da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-03-22 Simon Wright <simon@pushface.org> + + PR ada/89583 + * gnat.dg/socket2.adb: New. + 2019-03-22 Bill Schmidt <wschmidt@linux.ibm.com> * gcc.target/powerpc/mmx-psubd-2.c: Test _m_psubd. diff --git a/gcc/testsuite/gnat.dg/socket2.adb b/gcc/testsuite/gnat.dg/socket2.adb new file mode 100644 index 0000000..2ca5288 --- /dev/null +++ b/gcc/testsuite/gnat.dg/socket2.adb @@ -0,0 +1,16 @@ +-- { dg-do run } +with GNAT.Sockets; +procedure Socket2 is + Address : GNAT.Sockets.Sock_Addr_Type; + Server_Socket : GNAT.Sockets.Socket_Type; +begin + Address.Addr := GNAT.Sockets.Any_Inet_Addr; + Address.Port := 16#1234#; + GNAT.Sockets.Create_Socket (Server_Socket); + GNAT.Sockets.Set_Socket_Option + (Server_Socket, + GNAT.Sockets.Socket_Level, + (GNAT.Sockets.Reuse_Address, True)); + GNAT.Sockets.Bind_Socket (Server_Socket, Address); + GNAT.Sockets.Close_Socket (Server_Socket); +end Socket2; |