Commit 29e0246c by Pierre-Marie de Rodat

[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
parent b6c5f9f3
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> 2019-03-11 Martin Liska <mliska@suse.cz>
* gcc-interface/misc.c (gnat_post_options): Wrap option name in string * gcc-interface/misc.c (gnat_post_options): Wrap option name in string
......
...@@ -461,12 +461,12 @@ package body GNAT.Sockets is ...@@ -461,12 +461,12 @@ package body GNAT.Sockets is
is is
Res : C.int; Res : C.int;
Sin : aliased Sockaddr; Sin : aliased Sockaddr;
Len : constant C.int := Sin'Size / 8;
begin begin
Set_Address (Sin'Unchecked_Access, Address); 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 if Res = Failure then
Raise_Socket_Error (Socket_Errno); Raise_Socket_Error (Socket_Errno);
...@@ -666,12 +666,11 @@ package body GNAT.Sockets is ...@@ -666,12 +666,11 @@ package body GNAT.Sockets is
Server : Sock_Addr_Type) return C.int Server : Sock_Addr_Type) return C.int
is is
Sin : aliased Sockaddr; Sin : aliased Sockaddr;
Len : constant C.int := Sin'Size / 8;
begin begin
Set_Address (Sin'Unchecked_Access, Server); 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; end Connect_Socket;
procedure Connect_Socket procedure Connect_Socket
...@@ -1794,7 +1793,7 @@ package body GNAT.Sockets is ...@@ -1794,7 +1793,7 @@ package body GNAT.Sockets is
end if; end if;
end loop; end loop;
return Colons <= 7; return Colons <= 8;
end Is_IPv6_Address; end Is_IPv6_Address;
--------------------- ---------------------
...@@ -2403,7 +2402,7 @@ package body GNAT.Sockets is ...@@ -2403,7 +2402,7 @@ package body GNAT.Sockets is
if To /= null then if To /= null then
Set_Address (Sin'Unchecked_Access, To.all); Set_Address (Sin'Unchecked_Access, To.all);
C_To := Sin'Address; C_To := Sin'Address;
Len := Sin'Size / 8; Len := C.int (Thin_Common.Lengths (To.Family));
else else
C_To := System.Null_Address; C_To := System.Null_Address;
......
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> 2019-03-22 Bill Schmidt <wschmidt@linux.ibm.com>
* gcc.target/powerpc/mmx-psubd-2.c: Test _m_psubd. * gcc.target/powerpc/mmx-psubd-2.c: Test _m_psubd.
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment