diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6cb538945ed..81b5db972c4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2019-03-22 Dmitriy Anisimkov + + 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 * 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 c0b307964c5..476a213b038 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 6f17f242b4f..2fee0da5386 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-03-22 Simon Wright + + PR ada/89583 + * gnat.dg/socket2.adb: New. + 2019-03-22 Bill Schmidt * 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 00000000000..2ca5288fb77 --- /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;