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>
* gcc-interface/misc.c (gnat_post_options): Wrap option name in string
......
......@@ -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;
......
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.
......
-- { 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